Что означает объект, который должен быть инициирован один раз, но вызван разными потоками? (Я имею в виду сервлеты ..)

1

Поэтому я знаю, что есть только один экземпляр сервлета, и методы сервлетов вызываются разными потоками. Я хочу понять эту концепцию, но мне тяжело.

Представьте, что у меня есть этот класс одним способом:

public class A{

    public void foo(Bar bar){
    }

}

Как может быть один объект A, но он будет вызываться разными потоками? Любая помощь?

  • 1
    Трудно понять, с чем вам нужна помощь. Есть один объект, А. Он существует где-то в памяти. Затем множество потоков выполняет функцию foo для объекта A. Что смущает?
Теги:
servlets
multithreading

1 ответ

2
Лучший ответ

Вот программа, которая иллюстрирует концепцию, используя ваш пример:

// Here is your class
public class A {
    public void foo(Bar bar){
        System.out.println(bar);
    }
}
// Here is a class with a main that runs foo(Bar) on five threads
public class Demo extends Thread {
    static A sharedA = new A();
    Bar myBar = new Bar();
    public void run() {
        sharedA.foo(myBar);
    }
    public static void main(String args[]) {
        for (int i = 0 ; i != 5 ; i++) {
            (new Demo()).start();
        }
    }
}

Выше, есть только один экземпляр A, потому что sharedA static. main() создает пять потоков, причем каждый поток вызывает метод foo для общего экземпляра A

Вы можете немного поиграть с этой демонстрацией - например, попробуйте изменить A чтобы подсчитать вызовы foo и запустить его из нескольких сотен потоков. Вы обнаружите, что если вы просто увеличиваете счетчик, вы получаете противоречивые результаты, и вам нужно использовать синхронизацию или атомное целое, чтобы правильно подсчитывать.

  • 0
    Спасибо, отличный ответ. И вот как работают сервлеты, верно?
  • 0
    @KorayTugay Ну, не совсем - потоки, которые обращаются к сервлету, инициируются входящими запросами. Также объект Servlet не обязательно хранится в статической переменной. Но общий доступ один и тот же: объект сервлета создается только один раз при запуске приложения, а затем все запросы вызывают одни и те же методы из разных потоков.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню