Подтвердить что ты не робот

Как синглетный Bean служит для одновременного запроса?

У меня вопрос о том, как singleton beans подробно описывать параллельные запросы.

Я искал StackOverflow по этому вопросу. Это пример qaru.site/info/219487/..., но я нашел только подробные сведения о высоком уровне. Я хочу получить подробную информацию о том, как singleton bean обслуживает одновременные запросы и как системный процессор увидит эти запросы.

Я изучил параллельную обработку запросов в системном процессоре онлайн. Они сказали, что процессор сам имеет планировщик, и планировщик решит, какой запрос обрабатывается.

Хорошо. Если предположим, что у меня есть более одного основного процессора, как планировщик обрабатывает параллельные запросы?

Может кто-нибудь объяснить мне пошаговый процесс о том, как singleton bean будет обслуживать одновременные запросы в JVM и системе?

Позвольте мне объяснить конкретный пример. У меня есть класс вроде Sports:

class Sports {
    public void playFootball() {
    }

    public void playVolleyBall() {
    }
}

Приходят два запроса. Первый запрос выполняет метод playFootball для созданного экземпляра singleton класса Sports. В то же время другой запрос выполняет метод playVolleyBall в том же созданном экземпляре singleton класса Sports.

Как это возможно с экземпляром singleton?

4b9b3361

Ответ 1

Сараван Кумар,

Я понимаю мотивы вашего вопроса. До того, как я начал работать над компиляторами, у меня также было очень похожее желание знать внутреннюю часть виртуальной машины Java.

Прежде всего, я впечатлен вашим вопросом. Для решения вашего вопроса необходимо несколько различий и понимания. Во-первых: шаблон Singleton, иногда даже называемый анти-шаблоном, гарантирует, что только один экземпляр этого класса доступен для JVM (виртуальная машина Java). Это означает, что мы по сути вводим глобальное состояние в приложение. Я знаю, что вы понимаете это, но это просто пояснение.

Теперь о внутренностях.

Когда мы создаем экземпляр класса, мы создаем объект, который находится в общей памяти JVM. Теперь эти потоки независимо выполняют код, который работает с этими экземплярами. Каждый поток имеет рабочую память, в которой он хранит данные из основной памяти, которые распределяются между всеми потоками. Здесь находится ссылка на созданный вами объект Singleton. По сути, происходит то, что байт-код, который был сгенерирован и является представителем созданного вами одноэлементного объекта, выполняется в каждом из этих потоков.

Теперь, как это происходит, выглядит следующим образом:

Каждый поток JVM имеет собственный стек JVM, созданный одновременно с потоком. Теперь у JVM есть куча, которая используется всеми потоками JVM. Куча - это область данных времени выполнения, из которой выделяется память для всех экземпляров и массивов классов. Куча создается при запуске ВМ. Когда ваш поток запрашивает экземпляр синглтона, он будет указывать на ссылку в куче, где находится байт-код для этого синглтона. Собирается выполнить соответствующий код. В вашем случае он будет выполнять первый метод для первого запроса и второй метод для второго запроса. Он может сделать это, потому что нет никаких блокировок или ограничений, препятствующих компилятору указывать счетчик программы на область в куче, где расположен этот экземпляр. Единственное ограничение, которое класс Singleton накладывает на виртуальную машину Java, заключается в том, что он может иметь только один экземпляр в куче этого класса. Это просто так. Помимо этого, вы можете ссылаться на него 100 раз из вашего метода, компилятор будет указывать на один и тот же байт-код и просто выполнять его. Вот почему мы обычно хотим, чтобы класс Singleton не имел состояния, потому что, если к нему обращаются какие-либо потоки, мы не хотим, чтобы внутренние переменные изменялись из-за отсутствия контроля параллелизма.

Пожалуйста, дай мне знать, если возникнут какие-либо вопросы!

Ответ 2

Идеальный синглтон bean не должен сохранять состояние. Это означает, что у него не будет никаких переменных, которые хранят что-либо конкретное для запроса, который он обслуживает.

Таким образом, singleton bean будет просто иметь код без состояния (например, методы контроллера), который может выполняться одновременно для нескольких запросов без каких-либо проблем concurrency.

Например, если был ваш синглтон bean:

@Service
public class Calculator {

   public int sum(int a, int b) {
        return a + b;
   } 

}

В простых терминах, когда два "запроса" одновременно вызывают метод sum для bean, это означает, что метод sum будет выполняться одновременно в двух разных потоках. Следовательно, у них будет свой собственный контекст выполнения, который не будет перекрываться друг с другом. Это позволит им безопасно работать одновременно.

Если тот же bean должен был иметь следующее состояние:

@Service
public class Calculator {

   int incrementalMultiplier = 0;

   public int mulitply(int a, int b) {
        incrementalMultiplier++;
        return a * b * incrementalMultiplier;
   } 

}

Это может вызвать проблемы при одновременном обслуживании двух запросов, поскольку incrementalMultiplier - это состояние уровня объекта, которое будет разделяться двумя запросами (потоками) и, следовательно, может привести к неожиданным результатам.

Короче говоря, синтаксис без состояния не сможет одновременно выполнять два запроса, потому что они будут в разных потоках.

Ответ 3

Я видел множество указаний на то, чтобы оставить общий синглтон beans безстоящим, и я хотел представить пример использования, в котором имеет смысл синтаксис с состоянием в поддержке веб-приложения bean.

У меня есть административное веб-приложение, которое по запросу запрашивает две отдельные системы (CRM и Digital Assets Manager - DAM) для пользовательских данных, сравнивает записи и соответственно обновляет DAM, используя свой API. Это иногда занимает очень много времени, если есть много обновлений. Веб-интерфейс отображает статус обновлений в режиме реального времени, так как браузер опрашивает поддержку bean с помощью ajax каждую секунду, чтобы отобразить индикатор выполнения и сколько учетных записей пользователей он обработал. Пользовательский интерфейс также предоставляет кнопку для запуска процесса синхронизации и кнопку для ее остановки. Кнопка синхронизации сначала включена, а кнопка останова не отображается. После того, как пользователь нажимает кнопку "Пуск", кнопка "Пуск" отключается, и кнопка останова включена.

Пока синхронизация активна, я хочу, чтобы разные клиенты (разные пользователи на клавиатуре с помощью веб-приложения в своих отдельных браузерах) видели одно и то же состояние, то есть индикатор выполнения и количество обработанных учетных записей пользователей и кнопку. Это важно, потому что нет смысла запускать второй процесс синхронизации, пока он уже находится в процессе.

Ответ 4

Узнать подробнее Как синглетный Bean служит для одновременного запроса? вы должны знать следующие вещи о Spring Beans

  • Bean области

    Spring имеет различные области Bean (например, Prototype, Singleton и т.д.), но все эти области применения применяются, когда создается Bean. Например, область "prototype" Bean будет создаваться каждый раз, когда этот Bean "вводится". тогда как "singleton" scoped Bean будет создан один раз и будет использоваться в контексте приложения.
    Область "singleton" - область по умолчанию Spring Bean.

  • Создание Bean

    Весь жизненный цикл Spring Bean управляется контейнером Spring (то есть ApplicationContext/BeanFacotry) Spring Контейнер внутренне ссылается на определение Bean (база X.X. на основе аннотации) для создания фактических экземпляров класса, определенного этим определением Bean. теперь, когда Spring Контейнер запускается, он ссылается на определение Bean и устанавливает все определенные Bean.

  • Запросить Bean.

    Теперь, когда ваш объект сделает запрос к Bean, тогда Spring Контейнер передаст Bean, который все инициализирован.

  • Spring Bean Область действия

  • Безопасны ли потоки Spring?

  • Spring Учебное пособие 11 - Понимание Bean Области

надеюсь, что это поможет вам...

Ответ 5

Singleton - это область bean. Вы должны справиться с тем, как обслуживать несколько потоков. Вы можете использовать синхронизацию или параллельные пакеты. Ссылка: Являются ли Spring singleton beans потокобезопасными?

Для параллельного запроса одиночный bean будет обслуживать по очереди несколько запросов.