电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

淺談Spring中單例Bean是線程安全的嗎

瀏覽:97日期:2023-08-09 16:03:14

Spring容器中的Bean是否線程安全,容器本身并沒有提供Bean的線程安全策略,因此可以說Spring容器中的Bean本身不具備線程安全的特性,但是具體還是要結合具體scope的Bean去研究。

Spring 的 bean 作用域(scope)類型

1、singleton:單例,默認作用域。

2、prototype:原型,每次創建一個新對象。

3、request:請求,每次Http請求創建一個新對象,適用于WebApplicationContext環境下。

4、session:會話,同一個會話共享一個實例,不同會話使用不用的實例。

5、global-session:全局會話,所有會話共享一個實例。

線程安全這個問題,要從單例與原型Bean分別進行說明。

原型Bean

對于原型Bean,每次創建一個新對象,也就是線程之間并不存在Bean共享,自然是不會有線程安全的問題。

單例Bean

對于單例Bean,所有線程都共享一個單例實例Bean,因此是存在資源的競爭。

如果單例Bean,是一個無狀態Bean,也就是線程中的操作不會對Bean的成員執行查詢以外的操作,那么這個單例Bean是線程安全的。比如Spring mvc 的 Controller、Service、Dao等,這些Bean大多是無狀態的,只關注于方法本身。

有狀態對象(Stateful Bean) :就是有實例變量的對象,可以保存數據,是非線程安全的。每個用戶有自己特有的一個實例,在用戶的生存期內,bean保持了用戶的信息,即“有狀態”;一旦用戶滅亡(調用結束或實例結束),bean的生命期也告結束。即每個用戶最初都會得到一個初始的bean。

無狀態對象(Stateless Bean):就是沒有實例變量的對象,不能保存數據,是不變類,是線程安全的。bean一旦實例化就被加進會話池中,各個用戶都可以共用。即使用戶已經消亡,bean 的生命期也不一定結束,它可能依然存在于會話池中,供其他用戶調用。由于沒有特定的用戶,那么也就不能保持某一用戶的狀態,所以叫無狀態bean。但無狀態會話bean 并非沒有狀態,如果它有自己的屬性(變量),那么這些變量就會受到所有調用它的用戶的影響,這是在實際應用中必須注意的。

對于有狀態的bean,Spring官方提供的bean,一般提供了通過ThreadLocal去解決線程安全的方法,比如RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder等。

使用ThreadLocal的好處

使得多線程場景下,多個線程對這個單例Bean的成員變量并不存在資源的競爭,因為ThreadLocal為每個線程保存線程私有的數據。這是一種以空間換時間的方式。

當然也可以通過加鎖的方法來解決線程安全,這種以時間換空間的場景在高并發場景下顯然是不實際的。

補充知識:Spring Bean Scope 有狀態的Bean 無狀態的Bean

在Spring的Bean配置中,存在這樣兩種情況:

<bean scope='singleton' />

<bean scope='prototype' />

當然,scope的值不止這兩種,還包括了request,session 等。但用的最多的還是singleton單態,prototype多態。

singleton表示該bean全局只有一個實例,Spring中bean的scope默認也是singleton.

prototype表示該bean在每次被注入的時候,都要重新創建一個實例,這種情況適用于有狀態的Bean.

對于SSH架構的系統,很少關心這方面,因為我們用到的一般都是singleton. Bean的注入由Spring管理。

對于有狀態的Bean呢?

下面是一個有狀態的Bean

package com.sw;public class TestManagerImpl implements TestManager{ private User user; public void deleteUser(User e) throws Exception { user = e ; //1 prepareData(e); } public void prepareData(User e) throws Exception { user = getUserByID(e.getId()); //2 ..... //使用user.getId(); //3 ..... ..... } }

如果該Bean配置為singleton,會出現什么樣的狀況呢?

如果有2個用戶訪問,都調用到了該Bean.

假定為user1,user2

當user1 調用到程序中的1步驟的時候,該Bean的私有變量user被付值為user1

當user1的程序走到2步驟的時候,該Bean的私有變量user被重新付值為user1_create

理想的狀況,當user1走到3步驟的時候,私有變量user應該為user1_create;

但如果在user1調用到3步驟之前,user2開始運行到了1步驟了,由于單態的資源共享,則私有變量user被修改為user2

這種情況下,user1的步驟3用到的user.getId()實際用到是user2的對象。

而如果是prototype的話,就不會出現資源共享的問題。

對于SSH來說,Bean的配置是沒錯的,配置為singleton ;實際應該是這個例子不應該用私有變量。這樣就使得這個Bean

由無狀態變成了有狀態Bean.還是應該盡量使用無狀態Bean.如果在程序中出現私有變量,盡量替換為參數。對于每個訪問私有變量的方法增加變量傳入或者通過ThreadLocal來獲取也是不錯的方法。

真正出現上面代碼問題的也是少數,出現的時候,一般是為了圖方便,一個很多方法都要用到的變量,如果都需要用參數的

方式傳遞多麻煩呀,這樣私有變量多好,不用參數那樣丑陋。但是丑陋并不代表不好,以對的,自己習慣的方式編程,才能

盡量避免問題的發生。

以上這篇淺談Spring中單例Bean是線程安全的嗎就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
主站蜘蛛池模板: 石英陶瓷,石英坩埚,二氧化硅陶瓷-淄博百特高新材料有限公司 | 重庆波纹管|重庆钢带管|重庆塑钢管|重庆联进管道有限公司 | 热回收盐水机组-反应釜冷水机组-高低温冷水机组-北京蓝海神骏科技有限公司 | 臻知网大型互动问答社区-你的问题将在这里得到解答!-无锡据风网络科技有限公司 | 上海APP开发-APP制作-APP定制开发-上海APP开发制作公司-咏熠科技 | 手术室净化装修-手术室净化工程公司-华锐手术室净化厂家 | 考勤系统_人事考勤管理系统_本地部署BS考勤系统_考勤软件_天时考勤管理专家 | 环讯传媒,永康网络公司,永康网站建设,永康小程序开发制作,永康网站制作,武义网页设计,金华地区网站SEO优化推广 - 永康市环讯电子商务有限公司 | 澳威全屋定制官网|极简衣柜十大品牌|衣柜加盟代理|全屋定制招商 百度爱采购运营研究社社群-店铺托管-爱采购代运营-良言多米网络公司 | 软瓷_柔性面砖_软瓷砖_柔性石材_MCM软瓷厂家_湖北博悦佳软瓷 | 武汉刮刮奖_刮刮卡印刷厂_为企业提供门票印刷_武汉合格证印刷_现金劵代金券印刷制作 - 武汉泽雅印刷有限公司 | 旗杆生产厂家_不锈钢锥形旗杆价格_铝合金电动旗杆-上海锥升金属科技有限公司 | 三价铬_环保铬_环保电镀_东莞共盈新材料贸易有限公司 | 液氨泵,液化气泵-淄博「亚泰」燃气设备制造有限公司 | 冷却塔减速机器_冷却塔皮带箱维修厂家_凉水塔风机电机更换-广东康明冷却塔厂家 | 无菌实验室规划装修设计-一体化实验室承包-北京洁净净化工程建设施工-北京航天科恩实验室装备工程技术有限公司 | 机制砂选粉机_砂石选粉机厂家-盐城市助成粉磨科技有限公司 | 菲希尔X射线测厚仪-菲希尔库伦法测厚仪-无锡骏展仪器有限责任公司 | 二手光谱仪维修-德国OBLF光谱仪|进口斯派克光谱仪-热电ARL光谱仪-意大利GNR光谱仪-永晖检测 | 游动电流仪-流通式浊度分析仪-杰普仪器(上海)有限公司 | 锻造液压机,粉末冶金,拉伸,坩埚成型液压机定制生产厂家-山东威力重工官方网站 | 无味渗透剂,泡沫抑尘剂,烷基糖苷-威海威能化工有限公司 | 好杂志网-首页| 顺辉瓷砖-大国品牌-中国顺辉 | 东莞市超赞电子科技有限公司 全系列直插/贴片铝电解电容,电解电容,电容器 | 沈阳液压泵_沈阳液压阀_沈阳液压站-沈阳海德太科液压设备有限公司 | 威实软件_软件定制开发_OA_OA办公系统_OA系统_办公自动化软件 | 算命免费_生辰八字_免费在线算命 - 卜算子算命网 | 污水提升器,污水提升泵,污水提升装置-德国泽德(zehnder)水泵系统有限公司 | led太阳能路灯厂家价格_风光互补庭院灯_农村市政工程路灯-中山华可路灯品牌 | 北京浩云律师事务所-法律顾问_企业法务_律师顾问_公司顾问 | 深圳3D打印服务-3D打印加工-手板模型加工厂-悟空打印坊 | 净化板-洁净板-净化板价格-净化板生产厂家-山东鸿星新材料科技股份有限公司 | CTAB,表面活性剂1631溴型(十六烷基三甲基溴化铵)-上海升纬化工原料有限公司 | 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | hdpe土工膜-防渗膜-复合土工膜-长丝土工布价格-厂家直销「恒阳新材料」-山东恒阳新材料有限公司 ETFE膜结构_PTFE膜结构_空间钢结构_膜结构_张拉膜_浙江萬豪空间结构集团有限公司 | 轴流风机-鼓风机-离心风机-散热风扇-罩极电机,生产厂家-首肯电子 | 欧版反击式破碎机-欧版反击破-矿山石料破碎生产线-青州奥凯诺机械 | 自动气象站_农业气象站_超声波气象站_防爆气象站-山东万象环境科技有限公司 | 加热制冷恒温循环器-加热制冷循环油浴-杭州庚雨仪器有限公司 | 上海平衡机-单面卧式动平衡机-万向节动平衡机-圈带动平衡机厂家-上海申岢动平衡机制造有限公司 |