问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Spring 单例 多例 线程安全等问题,想请教大家

发布网友 发布时间:2022-04-22 15:00

我来回答

2个回答

热心网友 时间:2023-10-19 06:17

Spring作为一个IOC/DI容器,帮助我们管理了许许多多的“bean”。但其实,Spring并没有确保这些对象的线程安全,需要由开发者自己编写解决线程安全问题的代码。
Spring对每个bean提供了一个scope属性来表示该bean的作用域。它是bean的生命周期。

我们知道在一般情况下,只有无状态的Bean才可以在多线程环境下共享,在Spring中,绝大部分Bean都可以声明为singleton作用域。就是因为Spring对一些Bean(如RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder等)中非线程安全状态采用ThreadLocal进行处理,让它们也成为线程安全的状态,因为有状态的Bean就可以在多线程*享了。
一般的Web应用划分为展现层、服务层和持久层三个层次,在不同的层中编写对应的逻辑,下层通过接口向上层开放功能调用。在一般情况下,从接收请求到返回响应所经过的所有程序调用都同属于一个线程。
ThreadLocal是解决线程安全问题一个很好的思路,ThreadLocal是一个为线程提供线程局部变量的工具类。它的思想也十分简单,就是为线程提供一个线程私有的变量副本,这样多个线程都可以随意更改自己线程局部的变量,不会影响到其他线程。不过需要注意的是,ThreadLocal提供的只是一个浅拷贝,如果变量是一个引用类型,那么就要考虑它内部的状态是否会被改变,想要解决这个问题可以通过重写ThreadLocal的initialValue()函数来自己实现深拷贝,建议在使用ThreadLocal时一开始就重写该函数。
ThreadLocal通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题。在很多情况下,ThreadLocal比直接使用synchronized同步机制解决线程安全问题更简单,更方便,且结果程序拥有更高的并发性。
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。

热心网友 时间:2023-10-19 06:18

你的问题都看了,其实就是线程安全问题,跟spring并没有什么关系。需要清楚两点

线程安全问题是多线程访问共享数据才会存在的,这包括两种情况,一是多线程访问单例的成员变量,二是多线程访问静态变量(数据库这里这就不算了)

线程内部不会产生安全问题,从java内存模型来看,一个线程对于对象的操作流程应该是,访问主存中的对象并复制到工作内存当中,在工作内存中对副本做相应操作,操作完成后再写入主存,线程见会产生线程安全问题,正是因为一个线程在操作工作内存中的副本时,在写入主存之前,其他线程是不可见的,所以会产生问题,而线程内部,无论哪个方法怎么执行,对副本都是可见的,你说的两种情况其实也是不存在的,情况1,如果你在一个线程中,一个方法执行到一半,去执行另一个方法,代码怎么写?肯定是在第一个方法中调用第二个方法,那么第二个方法执行完,第一个方法的后半部分肯定要接着第二个的逻辑写,还接着第一个方法的前一半写,那就是代码写错了,情况2相同

这两点应该可以解答你所有的问题

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
女生多大后可以不在长身高? 如何不用软件把手机投屏到电脑上手机屏幕怎样投放到电脑上 战时拒绝、故意延误军事订货罪既遂的处罚? 战时故意延误军事订货罪处罚标准 名师1+1导读方案:汤姆·索亚历险记目录 三星sm-g7200打开微信慢,无法正常收看,网速不慢。 笔记本电脑如何调亮屏幕亮度 大伙说说洗衣机要不要带烘干好 热烘干洗衣机怎么样 ef英语哪个好 Spring bean作用域 吃美国康萃乐益生菌还用吃双岐杆菌吗 EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的? EJB3.0的有状态Bean与无状态Bean的最基础问题 Culturelle儿童益生菌冲剂是怎么服用的?该冲多少水? 有状态的bean和无状态的bean的区别 无状态的javabean中可以使用静态变量吗 美国康萃乐益生菌好用吗? EJB有状态的会话Bean和无状态的会话Bean的区别 康萃乐里面的鼠李糖乳杆菌是什么东西?有什么用? Spring中到底什么叫有无状态的Bean,什么叫 崔玉涛推荐的3种益生菌 谁有《听说听说2009》百度云无删减完整版在线观看,彭于晏主演的? 康萃乐益生菌可以长期吃吗?会不会有依赖? 法国人的姓名太长,订机票无法出票,有没有知道这些姓(nom)的,可以怎么缩写啊??!! NOM认证的标志 护照上的surnae-nom是什么意思 后缀名为.nom是什么意思 怎么打开 404 Not Found 法语 nom是姓还是名 spring配置文件中能够用到的bean的作用域都有哪些 大人可以吃益生菌吗? EJb中有状态会话构件和无状态会话构件 慢性结肠炎用康萃乐益生菌可以治疗吗 宝宝知道 spring 的singleton 和prototype的区别和应用场合? spring bean作用域怎么选择 spring什么情况下使用非单例bean SPRING中属性SCOPE的prototype是什么意思 为什么说传统的Servlet对象是一个无状态对象 singleton和prototype的区别 spring的ioc容器怎样为普通的类创建单例? tplink150m无线路由器怎么设置 TP-link150M无线路由器怎么设置详细点的 普联无线150M路由器怎么安装 急 tplink150m路由器怎么重置 TP-LINK150m无线路由器无法使用 TP-LINK150M无线宽带路由器怎么设置? 普联150M路由器怎么进入设置界面 TP-LINK无线路由器,什么150M,300M是什么意思?如果直接接到网线上是不是不记流量了? tp-link150m迷你型无线路由器