设为首页收藏本站

安徽论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 37631|回复: 0

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

[复制链接]

77

主题

0

回帖

253

积分

中级会员

Rank: 3Rank: 3

积分
253
发表于 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
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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