Spring框架中的单例Bean是线程安全的吗?

首先直接给出答案:不是线程安全的

一、分析问题

证明不是线程安全的案例如下:

public class Student {private String stuName;public String report(String uname){stuName = "大家好,我叫:"+uname;try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}return stuName;}
}
-----------------------------------------------------------------------------------------------------------------
public class Run {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfig.class);Student bean1 = context.getBean(Student.class);new Thread(() -> {System.out.println(bean1.report("张三"));}).start();Student bean2 = context.getBean(Student.class);new Thread(() -> {System.out.println(bean2.report("李四"));}).start();}
}

请添加图片描述
分析原因:线程一执行完stuName的赋值后进入休眠,线程二这时候也进入该方法对stuName进行赋值,由于对象是单例的,线程二的赋值操作也就影响了线程一的打印结果。导致最后打印的结果都是线程二传入的值。

二、解决方法

既然单例bean不是线程安全的,那么该怎么解决上面的问题呢?下面博主给出四种解决方法仅供读者参考:

1.方法一:将成员变量放入方法中

修改后的Student类如下:

public class Student {
//    private String stuName;public String report(String uname){String stuName = "大家好,我叫:"+uname;try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}return stuName;}
}

2.方法二:加锁使方法串行执行

比如下面的方法中我加入了synchronized锁:

public class Student {private String stuName;public synchronized String report(String uname){stuName = "大家好,我叫:"+uname;try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}return stuName;}
}

3.方法三:将bean变成原型模式

比如加上Scope注解声明为多例模式:

	@Bean@Scope("prototype")public Student student(){return new Student();}

4.方法四:使用ThreadLocal

改造后的代码如下:

public class Student {private ThreadLocal<String> stuName = new ThreadLocal<>();public String report(String uname){stuName.set("大家好,我叫:"+uname);try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}return stuName.get();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557033.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三诺+n20g+微型计算机,原来是他?揭秘三诺永恒系列开山鼻祖

提起三诺&#xff0c;我们的脑海中常常会浮现出几个关键词&#xff0c;“高性价比”、 “独立功放”、“摩机大赛”等等&#xff0c;摩机大赛让我们对三诺永恒系列2.0音箱有了全新的认识&#xff0c;凭借出色的音质表现&#xff0c;永恒系列广受专业编辑和用户的好评&#xff0…

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

结论&#xff1a;不是线程安全的 Spring容器中的Bean是否线程安全&#xff0c;容器本身并没有提供Bean的线程安全策略&#xff0c;因此可以说Spring容器中的Bean本身不具备线程安全的特性&#xff0c;但是具体还是要结合具体scope的Bean去研究。 Spring 的 bean 作用域&#…

天文学专业在什么时候学计算机,南京大学在985排名第几?南京大学最牛的专业是天文系吗?...

选择科目测一测我能上哪些大学选择科目领取你的专属报告>选择省份关闭请选择科目确定v>百年名校南京大学坐落于金陵古都&#xff0c;文化底蕴深厚&#xff0c;是不少考生向往的“211”“985”“双一流”高校。本期圆梦志愿就来带大家看看这所学校在全国985高校中的排名情…

Java中的ThreadLocal详解

一、ThreadLocal简介 多线程访问同一个共享变量的时候容易出现并发问题&#xff0c;特别是多个线程对一个变量进行写入的时候&#xff0c;为了保证线程安全&#xff0c;一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线程安全性。ThreadLocal是除了加锁这种同…

计算机专用英语词汇pdf,计算机专用英语词汇1500词.pdf

计算机专用英语词汇1500 词 36. memory n. 记忆存储&#xff0c;存储器37. which pron. 哪个&#xff0c;a. 那一个Sample TextSample Text 38. all a. 全&#xff0c;全部&#xff1b;ad. 完全电脑日常用语和术语大集合~~ &#xff01;&#xff01;&#xff01; 39. on ad. 接…

谈谈对ThreadLocal的理解?(基于jdk1.8)

在java的多线程模块中&#xff0c;ThreadLocal是经常被提问到的一个知识点&#xff0c;提问的方式有很多种&#xff0c;可能是循序渐进也可能是就像我的题目那样&#xff0c;因此只有理解透彻了&#xff0c;不管怎么问&#xff0c;都能游刃有余。 这篇文章主要从以下几个角度来…

江苏学考计算机,学长建议 江苏考生 位次在4000-10000 想报考计算机的同学

本人对高考志愿填报有点执念&#xff0c;毕竟是第一次真正重大的抉择&#xff0c;以后每年都会看看高校录取情况&#xff0c;加上今年刚找工作&#xff0c;对互联网企业的选人标准比较了解&#xff0c;所以斗胆来提提建议。核心观点&#xff0c;多看看985的分校区&#xff0c;比…

mybatis if test判断 list不为空

<if test"list!null and list.size()!0"></if>注意 如果使用list.isNotEmpty()会报错&#xff0c;提示不是一个方法

数字时钟html5 js,html5 canvas js(数字时钟)实例代码

canvas dClock您的浏览器太古董了&#xff0c;升级吧&#xff01;var clock document.getElementById("clock");var cxt clock.getContext("2d");//显示数字时钟function showTime(m, n) {cxt.clearRect(0, 0, 500, 500);var now new Date;var hour no…

简单理解BigDecimal.valueof(Double t)与BigDecimal.valueof(String t)的区别——BigDecimal

上面的代码主要的区别在于 初始化BigDecimal时形参是double、String和float的区别 从上面可以看到&#xff0c;当double 和 float 时&#xff0c;实际保存的值并不是是准确的0.99&#xff0c;这是为什么呢 大致的原因是&#xff1a; BigDecimal(double val)将会把double型二…

在线计算机标准版,NCRE全国计算机等级一标准版级考试复习资料.doc

全国计算机等级一级考试复习资料内容&#xff1a;计算机基础知识、文字处理软件WORD复习题类型&#xff1a;填空题、选择题、综合题复习题数量&#xff1a;复习时间&#xff1a;12月5日—12月9日考试时间&#xff1a;12月9日(周三下午第三节课)参考对象&#xff1a;电子高专的学…

mysql 统计当天,本周,本月,上一月的数据

今天 select * from ht_invoice_information where year(create_date)year(date_sub(now(),interval 1 year)); select * from 表名 where to_days(时间字段名) to_days(now());昨天 select * from 表名 where to_days( now( ) ) - to_days( 时间字段名) < 1近期7天 sel…

下图中的蓝月亮为科学家用计算机,2018年高一地理前半期课时练习试卷带答案和解析...

目前人类可以观察到的最高级别天体系统是A. 总星系 B. 银河系 C. 太阳系 D. 地月系【答案】A【解析】本题考查天体系统的层次。距离相近的天体因相互吸引和相互绕转&#xff0c;构成不同级别的天体系统&#xff0c;天体系统的层次为&#xff1a;最高一级为总星系(即目前所知的宇…

邮政计算机网络,邮政计算机网络论文(共2018字).doc

邮政计算机网络论文(共2018字)邮政计算机网络论文(共2018字)一、邮政计算机网络基本现状分析邮政网络系统资源不足&#xff0c;数据传输技术滞后随着邮政储蓄代收付业务和电子邮政业务的快速发展&#xff0c;市场需要变化加快&#xff0c;现有网络系统资源不足&#xff0c;设备…

HashMap的put方法返回值问题

API文档中的描述&#xff1a; 先看一个例子 Map<Character, Integer> map new HashMap<Character, Integer>(); System.out.println(map.put(a, 0)); // null System.out.println(map.put(a, 1)); // 0 System.out.println(map.put(a, 2)); // 1 System.out.pri…

资金时间价值的计算机应用视频讲解,第八章资金时间价值与方案经济比选20161018讲解.ppt...

第八章资金时间价值与方案经济比选20161018讲解(二)净年值(NAV) 1、含义 净年值也称净年金(记作NAV)&#xff0c;它是把项目寿命期内的净现金流量按设定的折现率折算成与其等值的各年年末的等额净现金流量值。 2&#xff0e;计算 先求该项目的净现值&#xff0c;然后乘以资金回…

[Microsoft][ODBC SQL Server Driver][SQL Server]对象名 ‘***‘无效问题的解决方案器

[Microsoft][ODBC SQL Server Driver][SQL Server]对象名 ***无效问题的解决方案 在用Java进行SQL server数据编程时出现数据库连接成功后对表进行操作时报错“表名无效”。在网上搜了相关问题后均未解决&#xff0c;最后通过在表名前加数据库名的方式得以解决&#xff0c;记录…

Java中将Map转换为JSON

一个注意的地方&#xff1a;要选对jar包 Map map new HashMap();map.put("success", "true");map.put("photoList", photoList);map.put("currentUser", "zhang");//net.sf.json.JSONObject 将Map转换为JSON方法JSONObject…

掌上通计算机一级考试在线安装,计算机一级掌上通

计算机一级掌上通app是一款计算机等级考试学习的软件&#xff0c;让你在线学习计算机的操作知识&#xff0c;便于通过等级考试&#xff0c;快速准确&#xff1b;软件提供海量选择题的题库&#xff0c;随时随地做题&#xff0c;简单又方便&#xff0c;还有计算机基本操作讲解&am…

java获取时间,本周,本月,本季度的起始

package com.yong.util; import java.util.Calendar; import java.util.Date;public class TestDate {public static void main(String[] args) {System.out.println("当前时间&#xff1a;" new Date().toLocaleString());System.out.println("当天0点时间&…