spring的单例模式与线程安全

发布时间:2023-05-06 09:42:24

spring的单例模式和线程安全

1.bean在spring框架中获取实例时,是默认的单例模式,因此在多线程开发中可能会出现线程不安全的问题。当多个用户同时要求服务器时,容器(tomcat)每个请求将分配一个线程。此时,多个线程将并发执行该请求对应的业务逻辑(controller中的方法)。此时,应注意的是,如果controler(单个对象)中有全局变量并且可以修改,则需要考虑线程安全。有很多解决方案,比如设置@scope("prototype")为多例模式,为每个线程创建一个controller,也可以使用threadlocal。

2.实际上,spring的源码,比如RequestContextHolderTransactionSynchronizationManagerLoxaleContextHolder这些对象的创建方式也是单一的例子,底部由Threadlocal处理。Threadlocal的基本实现思路是,它将为每个线程提供一个独立的变量副本,从而隔离多个线程对数据的访问冲突,因为每个线程都有自己的变量副本,因此没有必要同步变量。

3.虽然service或dao对象在ssh或ssm框架中也是单例模式,但正如上面分析的,它们没有可修改的全局变量,因此在多线程环境中也是安全的。

4.事实上,在许多文章中,spring的单例模式和线程安全将提到一个具有状态对象和无状态对象的概念。无状态对象在多线程环境中是线程安全的,而有状态的对象不是。事实上,这个字面意思是正确的,因为如果对象不能存储数据,就不会有多个线程操作共享数据,这是自然安全的。概念如下

有状态就是有数据存储功能。有状态对象(Stateful Bean),有实例变量的对象可以保存数据,这是非线程安全的。在不同的调用方法之间不保留任何状态。

无状态是一种无法保存数据的操作。无状态对象(Stateless Bean),是没有实例变量的对象。数据不能保存,是不变的,是线程安全的。

但我认为很多文章中没有状态对象的例子是不合理的。例如:https://blog.csdn.net/bingjing12345/article/details/9794945,因为如果这个对象没有set放置方法,那只是可读的,实际上是安全的。

总结

事实上,你越了解框架底部的实现原理,你就越会被这个框架的想法所迷惑。你会感受到作者的想法是多么美妙,多么全面,多一个字太多,少一个字太少。

上一篇 图片上传功能 java(前端代码+后端)
下一篇 Java如何使用MySQL数据库?

文章素材均来源于网络,如有侵权,请联系管理员删除。

标签: Java教程Java基础Java编程技巧面试题Java面试题