Les haricots du printemps sont-ils sans danger pour les fils ?
Spring ne garantit pas la sécurité du fil des haricots.
Les haricots dans le conteneur Spring sont des singletons par défaut. Lorsqu'il y a une condition de concurrence critique dans un singleton, il y a un problème de sécurité des threads. Comme l'exemple suivant
Classe de comptage
package constxiong.interview.threadsafe; /** * 计数类 * @author ConstXiong * @date 2019-07-16 14:35:40 */ public class Counter { private int count = 0; public void addAndPrint() { try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(++count); } }
fichier de configuration Spring
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <bean id="counter" class="constxiong.interview.threadsafe.Counter" /> </beans>
Classe de test
package constxiong.interview.threadsafe; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class CounterTest { public static void main(String[] args) { final ApplicationContext context = new ClassPathXmlApplicationContext("spring_safe.xml"); for (int i = 0; i < 10; i++) { new Thread(){ @Override public void run() { Counter counter = (Counter)context.getBean("counter"); for (int j = 0; j < 1000; j++) { counter.addAndPrint(); } } }.start(); } } }
Imprimer le début et la fin du résultat
1 5 7 4 2 6 3 8 9 . . . 9818 9819 9820 9821 9822 9823 9824 9825
La valeur maximale attendue à imprimer doit être de 10000
Modifier le fichier de configuration Spring et changer la portée du bean au prototype
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <bean id="counter" class="constxiong.interview.threadsafe.Counter" scope="prototype"/> </beans>
Le résultat du test génère 10 1000
C'est-à-dire que chaque thread crée un objet Counter et compte indépendamment dans le thread, il n'y a donc pas de problème de sécurité des threads. Mais ce n’est pas le résultat souhaité, 10 000 sont imprimés.
Ainsi, la sécurité des threads des beans gérés par Spring est liée à l'existence ou non de conditions de concurrence dans la portée de création du bean et à l'environnement d'utilisation où se trouve le bean. Spring ne peut pas garantir la sécurité des threads des beans.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!