Maison  >  Article  >  Java  >  Les haricots du printemps sont-ils sans danger pour les fils ?

Les haricots du printemps sont-ils sans danger pour les fils ?

(*-*)浩
(*-*)浩avant
2019-09-12 16:14:593057parcourir

Les haricots du printemps sont-ils sans danger pour les fils ?

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

Les haricots du printemps sont-ils sans danger pour les fils ?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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer