Are bean s in spring thread safe?

Keywords: Programming Spring xml Java encoding

Spring does not guarantee thread safety of bean s.
The bean s in the default spring container are singleton. When there is a race condition in a single case, there is a thread safety problem. As the following example

Counting class

package constxiong.interview.threadsafe;
 
/**
 * Counting class
 * @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);
	}
	
}

 

spring profile

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

 

Test class

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

 

Print the beginning and end of the result

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

 

Modify the spring configuration file to change the bean scope to 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>

 

Test results output 10 1000

 

That is to say, each thread creates a Counter object, which counts independently within the thread. There is no thread safety problem. But it's not what we want, it's 10000.

 

Therefore, the thread safety of spring managed beans is related to the scope of bean creation and the existence of race conditions in the bean's using environment. Spring does not guarantee the thread safety of beans.


Original link
 

Posted by hucklebezzer on Mon, 30 Dec 2019 20:03:08 -0800