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

Являются ли Spring singleton beans потокобезопасными?

Я хочу знать, является ли Spring singleton beans потокобезопасным, если да, то почему, если нет, то почему?

Как я начинаю с Spring, так что помощь будет оценена.

4b9b3361

Ответ 1

Нет. Эти два понятия даже не связаны.

Синглотоны составляют создание. Этот шаблон проектирования гарантирует создание только одного экземпляра класса.

Безопасность потока - это выполнение. Чтобы процитировать Wikipedia:

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

Таким образом, безопасность потоков зависит только от кода и кода. И именно по этой причине Spring beans сами по себе не являются потокобезопасными.

Ответ 2

Spring singleton beans НЕ являются потокобезопасными только потому, что Spring создает их. К сожалению.

Ответ 3

Spring просто управляйте жизненным циклом singleton bean и поддерживает единственный экземпляр объекта. Безопасность резьбы не имеет к этому никакого отношения.

если нет, то почему?

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

Ответ 4

У меня другое восприятие: Spring singleton beans создаются один раз, и в любой момент времени может быть только один экземпляр.

Предположим, что у вас есть переменная экземпляра, которая изменена в несинхронизированном методе. В многопоточной среде один и тот же экземпляр класса будет назначен всем потокам, а 2 параллельных потока могут обновлять/изменять переменные экземпляра, которые могут привести к непредвиденной ситуации. Singleton beans не обеспечивает безопасность потоков, и теперь вы знаете, что использование переменных экземпляров может привести к неожиданному результату, у вас есть 2 варианта решения:

  • Не используйте переменные экземпляра в многопоточной среде. ИЛИ
  • Использовать синхронизированный блок/ключевое слово на методах везде, где переменные экземпляра изменены, чтобы избежать неожиданных результатов.

Ответ 5

Spring не гарантирует безопасность потока. Это будет вашей ответственностью. Spring создаст Singleton, но если его изменяет, то он может быть небезопасным потоком. Ответ IT-программиста должен заботиться о классе Spring bean таким образом, чтобы он был потокобезопасным.

Ответ 6

В Spring singleton beans не будет иметь состояния (без состояния). Singleton bean scope обеспечивает единый экземпляр для BeanFactory. Таким образом, в многопотоковой среде он не будет обеспечивать единый экземпляр даже при использовании Singleton bean.

Итак, чтобы исправить это, нам нужно изменить область bean из области singleton в область прототипа, поскольку ответственность разработчиков за обеспечение безопасности потоков лежит на разработчиках.

Ответ 7

Синглтон Бинс является потокобезопасным или не зависит от того, как записывается класс, объем которого одинарный. Каждый вызывающий поток будет иметь свое собственное выполнение и не будет мешать другому исполнению потока, если в классе Singleton не используется какой-либо код, который используется всеми вызывающими thread.eg, если класс имеет глобально объявленные переменные, к которым обращается его метод и значения изменяются, тогда это может вызвать проблему параллелизма, поэтому лучше иметь эти переменные на уровне метода, а не на уровне класса.

Ответ 8

Нет, боб Spring Singelton не безопасен для потоков, вот пример

public class Emmloyee {

private int id;

private String name;

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}


}

А вот и applicationContext.xml

  <bean id="emp" class="com.manikant.Emmloyee" p:id="26"  p:name="Manikant Gautam">

А вот и тестовый класс

   public class Test {

public static void main(String[] args) {

    ApplicationContext ctx=new ClassPathXmlApplicationContext("com/manikant/config.xml");
    Emmloyee emp=(Emmloyee)ctx.getBean("emp");
    System.out.println("User "+emp.getName() + " is of age "+emp.getId());
    emp.setName("Changed value");

    Emmloyee emp1=(Emmloyee)ctx.getBean("emp");
    System.out.println("User "+emp1.getName() + " is of age "+emp1.getId());


}

}

Вот вывод

      User Manikant Gautam is of age 26

      User Changed name is of age 26

изменение value на emp.setName("Changed value"); отражается и на разных bean emp1.

Ответ 9

According to my view, it totally thread safety of your singleton class totally depends on you have design/written your singleton class.

По моему мнению, это полностью поточно-ориентированная безопасность вашего синглтон-класса полностью зависит от того, разработали ли вы/написали свой синглтон-класс.Если есть какая-либо глобальная переменная, определяющая класс singleton, то он не будет потокобезопасным, потому что если несколько потоков совместно используют объект singleton и выполняют метод, который может обновить глобальную переменную, он не будет потокобезопасным.

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

Ответ 10

если нет, то почему?

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

Но если вы этого не сделаете, и вы используете spring для ввода любых переменных экземпляра, то да, они являются потокобезопасными.