一、线程安全问题都是由全局变量、静态变量和类的成员变量引起的。若每个线程中对全局变量、静态变量和类的成员变量只有读操作,而无写

操作,一般来说,这个全局变量是线程安全的,反之线程存在问题

二、因为Spring中的Bean默认是单例的,所以在定义成员变量时也有可能会发生线程安全问题。

三、解决方案

        A、在对应的类名上加上该注解@Scope("prototype")从而将默认的@Scope("")改为多例,表示每次调用该接口都会生成一个新的Bean。

        B、ThreadLocal解决问题
ThreadLocal作用:为每个使用该变量【全局变量、静态变量和类的成员变量】的线程分配一个独立的变量,从而互不影响
ThreadLocal底层原理:是一个Map,key:Thread.currentThread() value:变量 @RestController
//@Scope("prototype")
public class BeanController {
private static ThreadLocal<Integer> content = new ThreadLocal<Integer>() {
@Override
protected Integer initialValue() {
return (int)(Math.random()*10+100);
}
};
private static ThreadLocal<String> test = new ThreadLocal<String>() {
@Override
protected String initialValue() {
return "单例模式是不安全的"+(int)(Math.random()*10+100);
}
}; @RequestMapping("testBean")
public Object getSercurity(){
System.out.println(content.get());
System.out.println(test.get()); System.out.println();
return test.get();
}
} C、三种解决方案:尽量不要使用成员变量 D、四种解决方案:
前提:该程序是web应用,可以使用Spring Bean的作用域中的request,就是说在类前面加上@Scope("request"),表明每次请求都会生成一个新的Bean对象。作用于@Scope("prototype")类似。 链接地址:https://blog.csdn.net/weixin_42324471/article/details/90603651

Spring解决创建单例bean,而存在线程不安全问题,的解决方案的更多相关文章

  1. Spring IOC 容器源码分析 - 创建单例 bean 的过程

    1. 简介 在上一篇文章中,我比较详细的分析了获取 bean 的方法,也就是getBean(String)的实现逻辑.对于已实例化好的单例 bean,getBean(String) 方法并不会再一次去 ...

  2. spring创建单例bean

    (使用的spring版本是3.2.10) 在xml文件中配置一个普通的bean,默认使用单例,创建该bean的调用栈如下: ClassPathXmlApplicationContext //Class ...

  3. Spring使用facotry-method创建单例Bean总结<转>

       阅读目录 1 最原始的实现单例模式的方法(存在线程不安全): 2 通过关键字Synchronized强制线程同步 3 通过静态内部类进行单例 通过spring的factory-method来创建 ...

  4. 【Spring实战】—— 3 使用facotry-method创建单例Bean总结

    如果有这样的需求: 1 不想再bean.xml加载的时候实例化bean,而是想把加载bean.xml与实例化对象分离. 2 实现单例的bean 以上的情况,都可以通过工厂方法factory-metho ...

  5. Spring IOC(三)单例 bean 的注册管理

    Spring IOC(三)单例 bean 的注册管理 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) 在 Spring 中 ...

  6. Spring IOC 容器源码分析 - 获取单例 bean

    1. 简介 为了写 Spring IOC 容器源码分析系列的文章,我特地写了一篇 Spring IOC 容器的导读文章.在导读一文中,我介绍了 Spring 的一些特性以及阅读 Spring 源码的一 ...

  7. Spring单例Bean和线程安全

    Spring的bean默认都是单例的,这些单例Bean在多线程程序下如何保证线程安全呢?例如对于Web应用来说,Web容器对于每个用户请求都创建一个单独的Sevlet线程来处理请求,引入Spring框 ...

  8. Spring源码分析(十三)缓存中获取单例bean

    摘要:本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 介绍过FactoryBean的用法后,我们就可以了解bean加载的过程了 ...

  9. Spring框架中的单例bean是线程安全的吗?

    不,Spring框架中的单例bean不是线程安全的.

  10. Spring 框架中的单例 bean 是线程安全的吗?

    不,Spring 框架中的单例 bean 不是线程安全的.

随机推荐

  1. H5移动端开发注意事项

    1.安卓浏览器看背景图片,有些设备会模糊. 用同等比例的图片在PC机上很清楚,但是手机上很模糊,原因是什么呢? 经过研究,是devicePixelRatio作怪,因为手机分辨率太小,如果按照分辨率来显 ...

  2. DVR4 pg walkthrough Intermediate window

    nmap ┌──(root㉿kali)-[~/lab] └─# nmap -p- -A -sS 192.168.219.179 Starting Nmap 7.94SVN ( https://nmap ...

  3. dart变量声明和变量类型

    ps==>所有的代码必须放在main方法中 main方法有两种写法 1==> main() { print("你好,dart我们相遇了"); } 2==> voi ...

  4. RAW镜像格式介绍

    本文分享自天翼云开发者社区<RAW镜像格式介绍>,作者:z****n RAW(Raw Disk Image)是一种简单而基本的虚拟化镜像格式,用于存储虚拟机的磁盘内容.它是一种原始的二进制 ...

  5. Q:Linux查看进程启动服务的精确时间

    输入命令 获取进程号 #1#获取进程号ps -ef|grep java|grep 进程名#2#获取启动时间ps -p 进程号 -o lstart  展示启动时间:星期 月 日 小时:分钟:秒 年 一键 ...

  6. AAAT 笔记(P5649)

    实际上去掉主函数不长于线段树 3. 对于 LCT 每个点的虚儿子.用 splay 把它们串起来(称为新 splay,虽然是共用的). 具体来说,设 \(1\le x\le n\) 是原 LCT 的 s ...

  7. 手把手教你更优雅的享受 DeepSeek

    开始之前,首先要确定你已经配置好Ollama软件并正常运行DeepSeek本地模型.如果这一步还不清楚,请翻看之前的手把手教程<手把手教你部署 DeepSeek 本地模型>. 本文是手把手 ...

  8. QT5笔记: 15. 其他显示组件的常用功能

    其他显示组件的常用功能 代码 #include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget ...

  9. Docker 服务、镜像、容器简单命令使用

    Docker 进程相关命令 启动docker服务: systemctl start docker  查看docker服务状态: systemctl status docker 停止docker服务: ...

  10. Jmeter tcp 返回500,但服务器收到请求

    解决方法:再end of line(Eol)bytes value 正确写上报文最后两位十进制字节码