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