Heim  >  Artikel  >  Java  >  Sind Bohnen im Frühjahr fadensicher?

Sind Bohnen im Frühjahr fadensicher?

(*-*)浩
(*-*)浩nach vorne
2019-09-12 16:14:593057Durchsuche

Sind Bohnen im Frühjahr fadensicher?

Sind Bohnen im Frühjahr fadensicher?

Der Frühling garantiert nicht die Fadensicherheit von Bohnen.

Bohnen im Federbehälter sind standardmäßig Singletons. Wenn in einem Singleton eine Racebedingung vorliegt, liegt ein Thread-Sicherheitsproblem vor. Wie im folgenden Beispiel

Zählklasse

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);
	}
}

Federkonfigurationsdatei

<?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>

Testklasse

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();
		}
		
	}
	
}

Drucken Sie den Anfang und das Ende des Ergebnisses aus

1
5
7
4
2
6
3
8
9
.
.
.
9818
9819
9820
9821
9822
9823
9824
9825

Der maximal zu druckende Wert sollte 10000 sein

Ändern Sie die Federkonfigurationsdatei und ändern Sie die Bean Umfang zum Prototyp

<?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>

Das Testergebnis gibt 10 1000 aus

Sind Bohnen im Frühjahr fadensicher?Das heißt, jeder Thread erstellt ein Counter-Objekt und zählt unabhängig innerhalb des Threads, sodass kein Problem mit der Thread-Sicherheit besteht. Dies ist jedoch nicht das gewünschte Ergebnis, 10000 wird gedruckt.

Die Thread-Sicherheit von Beans, die von Spring verwaltet werden, hängt also davon ab, ob im Erstellungsbereich der Bean Race-Bedingungen vorliegen, und die Verwendungsumgebung, in der sich die Bean befindet, kann die Thread-Sicherheit von Beans nicht garantieren.

Das obige ist der detaillierte Inhalt vonSind Bohnen im Frühjahr fadensicher?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen