当前位置: 首页 > news >正文

Spring 中的 Bean 有哪些作用域?单例 Bean 在多线程环境下会有线程安全问题吗?为什么?

一、Spring 中 Bean 的作用域

singleton(单例,默认)

整个 Spring 容器中,该 Bean 只会被创建一次,所有请求(无论是哪个线程、哪个组件)获取到的都是同一个实例。

生命周期与容器一致:容器初始化时创建(默认懒加载可通过 @Lazy 关闭),容器销毁时销毁。

prototype(原型)

每次请求(如 getBean() 或依赖注入)时,容器都会创建一个新的 Bean 实例。

容器只负责创建,不负责销毁:实例交给调用方管理,不会随容器销毁而回收。

request(请求,仅 Web 环境)

每个 HTTP 请求对应一个独立的 Bean 实例,请求结束后实例销毁。

常用于存储请求级别的数据(如当前请求的用户信息)。

session(会话,仅 Web 环境)

每个 HTTP Session 对应一个 Bean 实例,会话过期后实例销毁。

常用于存储会话级别的数据(如用户登录状态)。

application(应用,仅 Web 环境)

整个 Web 应用(ServletContext)共享一个 Bean 实例,与应用生命周期一致。

类似单例,但作用域限定在 Web 应用内(区别于 singleton 的容器级别)。

websocket(WebSocket,仅 WebSocket 环境)

每个 WebSocket 连接对应一个 Bean 实例,连接关闭后销毁。

二、单例 Bean 在多线程环境下的线程安全问题

单例 Bean 本身不具备线程安全性,是否有线程安全问题取决于其内部状态的设计,具体分析如下:

无状态的单例 Bean 是线程安全的

若 Bean 中没有成员变量(或成员变量是常量、不可变对象),即 “无状态”,则多线程并发访问时不会有问题。

例如:一个仅包含查询逻辑的 Service,所有操作都基于方法参数,不修改任何全局状态,此时多线程访问安全。

有状态的单例 Bean 存在线程安全问题

若 Bean 中包含可修改的成员变量(即 “有状态”),多线程并发修改时会导致数据错乱,因为所有线程操作的是同一个实例的变量。

@Servicepublic class UserService {// 成员变量(状态)private String currentUser;public void setCurrentUser(String user) {this.currentUser = user; // 多线程并发修改时,会覆盖彼此的值}}

此时,线程 A 调用 setCurrentUser("A") 后,线程 B 立即调用 setCurrentUser("B"),可能导致线程 A 后续读取到的 currentUser 变为 “B”,出现数据不一致。

三、原因总结

单例 Bean 是 “全局唯一实例”,多线程共享该实例。

若 Bean 无状态(无共享变量或变量不可变),线程间没有竞争资源,因此安全。

若 Bean 有状态(存在可修改的共享变量),多线程并发修改时会产生竞态条件(Race Condition),导致线程安全问题。

解决思路:

避免在单例 Bean 中定义可修改的成员变量,尽量设计为无状态(推荐)。

若必须使用状态,可通过 ThreadLocal 存储线程私有变量(每个线程操作自己的副本)。

改用 prototype 作用域(但会增加对象创建开销,需权衡)。

http://www.dtcms.com/a/407051.html

相关文章:

  • 如何个网站做优化网站是用什么软件做的
  • 远程安全提示再升级!隐私屏开启位置突出、可录入被控锁屏...
  • 现在市面网站做推广好电子商务推广方式有哪些
  • Ansible Playbook 编写与模块详解
  • 114. 二叉树展开为链表
  • 使用 C++ 开发 Vim 插件
  • 企业网站手机端开发家纺网站模板
  • 网站后台怎样登陆什么网站可以做卷子
  • 初始react
  • 从 0 开始理解 Spring 的核心思想 —— IoC 和 DI(2)
  • Spring Validation 校验
  • 好的做彩平图的网站网站的seo 如何优化
  • CTF攻防世界WEB精选基础入门:robots
  • 【网络套接字编程】基于UDP协议的公共聊天室项目
  • python爬虫技术的运用与分析
  • 站长之家查询域名网站建设与维护 电子版
  • 行业商城网站建设多少钱网站建设软件的英文
  • CSS3 核心知识点与实战案例专栏
  • 企业网站建设中存在的问题分析黄冈做网站的公司哪家好
  • 单片机常见的编程语言有哪些?
  • 2.CSS3.(2).html
  • 什么是TCP/UDP/HTTP?
  • 解决银行任务池场景并发问题
  • 济南企业免费建站3d渲染网站建设
  • git实用命令
  • 面相对象程序设计与模块
  • 四川泰龙建设集团公司官方网站网站服务器 要求
  • 主频72Mhz采用高性能的32 位ARM®Cortex®-M0+ 内核的PY32C673芯片
  • Linux 内核编译,打包
  • android网站开发教程建筑行业网站开发