却写杂布计 发表于 2022-3-26 10:35:04

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

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 配置文件
                       
测试类
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();                }                        }        } 打印结果开头和结尾
157426389...98189819982098219822982398249825 期望打印出的最大值应该是 10000
 
修改 spring 配置文件,把 bean 的作用域改为 prototype
                      测试结果输出10个 1000

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



[*]基础与语法
[*]集合
[*]网络编程
[*]并发编程
[*]Web
[*]安全
[*]设计模式
[*]框架
[*]算法与数据结构
[*]异常
[*]文件解析与生成
[*]Linux
[*]MySQL
[*]Oracle
[*]Redis
[*]Dubbo
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: spring 中的 bean 是线程安全的吗?