温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

spring中bean属于线程安全的吗

发布时间:2020-11-09 11:37:32 来源:亿速云 阅读:340 作者:小新 栏目:编程语言

这篇文章主要介绍了spring中bean属于线程安全的吗,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。

Spring 不保证 bean 的线程安全。

默认 spring 容器中的 bean 是单例的。当单例中存在竞态条件,即有线程安全问题。如下面的例子

计数类

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

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>

测试类

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

打印结果开头和结尾

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

期望打印出的最大值应该是 10000

修改 spring 配置文件,把 bean 的作用域改为 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>

测试结果输出10个 1000

spring中bean属于线程安全的吗即每个线程都创建了一个 Counter 对象,线程内独自计数,不存在线程安全问题。但是不是我们想要的结果,打印出 10000。

所以 spring 管理的 bean 的线程安全跟 bean 的创建作用域和 bean 所在的使用环境是否存在竞态条件有关,spring 并不能保证 bean 的线程安全。

感谢你能够认真阅读完这篇文章,希望小编分享spring中bean属于线程安全的吗内容对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,遇到问题就找亿速云,详细的解决方法等着你来学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI