设为首页收藏本站

安徽论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 43407|回复: 0

spring 中的 bean 是线程安全的吗?

[复制链接]

77

主题

840

回帖

1509

积分

金牌会员

Rank: 6Rank: 6

积分
1509
发表于 2022-3-26 10:35:04 | 显示全部楼层 |阅读模式
网站内容均来自网络,本站只提供信息平台,如有侵权请联系删除,谢谢!
spring 中的 bean 是线程安全的吗?

   Spring 不保证 bean 的线程安全。
默认 spring 容器中的 bean 是单例的。当单例中存在竞态条件,即有线程安全问题。如下面的例子
计数类
  1. 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 配置文件
  1.                        
复制代码
 
测试类
  1. 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. 157426389...98189819982098219822982398249825
复制代码
期望打印出的最大值应该是 10000
 
修改 spring 配置文件,把 bean 的作用域改为 prototype
  1.                        
复制代码
测试结果输出10个 1000

即每个线程都创建了一个 Counter 对象,线程内独自计数,不存在线程安全问题。但是不是我们想要的结果,打印出 10000。
 
所以 spring 管理的 bean 的线程安全跟 bean 的创建作用域和 bean 所在的使用环境是否存在竞态条件有关,spring 并不能保证 bean 的线程安全。
 

【Java面试题与答案】整理推荐


 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
免责声明
1. 本论坛所提供的信息均来自网络,本网站只提供平台服务,所有账号发表的言论与本网站无关。
2. 其他单位或个人在使用、转载或引用本文时,必须事先获得该帖子作者和本人的同意。
3. 本帖部分内容转载自其他媒体,但并不代表本人赞同其观点和对其真实性负责。
4. 如有侵权,请立即联系,本网站将及时删除相关内容。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表