欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2020年10月10日 09:01:38   作者:超域  
這篇文章主要介紹了淺談Spring中單例Bean是線程安全的嗎?具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

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

Spring 的 bean 作用域(scope)類型

1、singleton:單例,默認(rèn)作用域。

2、prototype:原型,每次創(chuàng)建一個(gè)新對(duì)象。

3、request:請(qǐng)求,每次Http請(qǐng)求創(chuàng)建一個(gè)新對(duì)象,適用于WebApplicationContext環(huán)境下。

4、session:會(huì)話,同一個(gè)會(huì)話共享一個(gè)實(shí)例,不同會(huì)話使用不用的實(shí)例。

5、global-session:全局會(huì)話,所有會(huì)話共享一個(gè)實(shí)例。

線程安全這個(gè)問題,要從單例與原型Bean分別進(jìn)行說明。

原型Bean

對(duì)于原型Bean,每次創(chuàng)建一個(gè)新對(duì)象,也就是線程之間并不存在Bean共享,自然是不會(huì)有線程安全的問題。

單例Bean

對(duì)于單例Bean,所有線程都共享一個(gè)單例實(shí)例Bean,因此是存在資源的競爭。

如果單例Bean,是一個(gè)無狀態(tài)Bean,也就是線程中的操作不會(huì)對(duì)Bean的成員執(zhí)行查詢以外的操作,那么這個(gè)單例Bean是線程安全的。比如Spring mvc 的 Controller、Service、Dao等,這些Bean大多是無狀態(tài)的,只關(guān)注于方法本身。

有狀態(tài)對(duì)象(Stateful Bean) :就是有實(shí)例變量的對(duì)象,可以保存數(shù)據(jù),是非線程安全的。每個(gè)用戶有自己特有的一個(gè)實(shí)例,在用戶的生存期內(nèi),bean保持了用戶的信息,即“有狀態(tài)”;一旦用戶滅亡(調(diào)用結(jié)束或?qū)嵗Y(jié)束),bean的生命期也告結(jié)束。即每個(gè)用戶最初都會(huì)得到一個(gè)初始的bean。

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

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

使用ThreadLocal的好處

使得多線程場景下,多個(gè)線程對(duì)這個(gè)單例Bean的成員變量并不存在資源的競爭,因?yàn)門hreadLocal為每個(gè)線程保存線程私有的數(shù)據(jù)。這是一種以空間換時(shí)間的方式。

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

補(bǔ)充知識(shí):Spring Bean Scope 有狀態(tài)的Bean 無狀態(tài)的Bean

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

<bean id="testManager" class="com.sw.TestManagerImpl" scope="singleton" />

<bean id="testManager" class="com.sw.TestManagerImpl" scope="prototype" />

當(dāng)然,scope的值不止這兩種,還包括了request,session 等。但用的最多的還是singleton單態(tài),prototype多態(tài)。

singleton表示該bean全局只有一個(gè)實(shí)例,Spring中bean的scope默認(rèn)也是singleton.

prototype表示該bean在每次被注入的時(shí)候,都要重新創(chuàng)建一個(gè)實(shí)例,這種情況適用于有狀態(tài)的Bean.

對(duì)于SSH架構(gòu)的系統(tǒng),很少關(guān)心這方面,因?yàn)槲覀冇玫降囊话愣际莝ingleton. Bean的注入由Spring管理。

對(duì)于有狀態(tài)的Bean呢?

下面是一個(gè)有狀態(tài)的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,會(huì)出現(xiàn)什么樣的狀況呢?

如果有2個(gè)用戶訪問,都調(diào)用到了該Bean.

假定為user1,user2

當(dāng)user1 調(diào)用到程序中的1步驟的時(shí)候,該Bean的私有變量user被付值為user1

當(dāng)user1的程序走到2步驟的時(shí)候,該Bean的私有變量user被重新付值為user1_create

理想的狀況,當(dāng)user1走到3步驟的時(shí)候,私有變量user應(yīng)該為user1_create;

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

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

而如果是prototype的話,就不會(huì)出現(xiàn)資源共享的問題。

對(duì)于SSH來說,Bean的配置是沒錯(cuò)的,配置為singleton ;實(shí)際應(yīng)該是這個(gè)例子不應(yīng)該用私有變量。這樣就使得這個(gè)Bean

由無狀態(tài)變成了有狀態(tài)Bean.還是應(yīng)該盡量使用無狀態(tài)Bean.如果在程序中出現(xiàn)私有變量,盡量替換為參數(shù)。
對(duì)于每個(gè)訪問私有變量的方法增加變量傳入或者通過ThreadLocal來獲取也是不錯(cuò)的方法。

真正出現(xiàn)上面代碼問題的也是少數(shù),出現(xiàn)的時(shí)候,一般是為了圖方便,一個(gè)很多方法都要用到的變量,如果都需要用參數(shù)的

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

盡量避免問題的發(fā)生。

以上這篇淺談Spring中單例Bean是線程安全的嗎就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java繼承方法重寫實(shí)現(xiàn)原理及解析

    Java繼承方法重寫實(shí)現(xiàn)原理及解析

    這篇文章主要介紹了Java繼承方法重寫實(shí)現(xiàn)原理及解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • JAVA最容易忽視的數(shù)據(jù)類型之枚舉詳解

    JAVA最容易忽視的數(shù)據(jù)類型之枚舉詳解

    這篇文章主要給大家介紹了關(guān)于JAVA最容易忽視的數(shù)據(jù)類型之枚舉的相關(guān)資料,Java中的枚舉類型是一種特殊的類型,它允許程序員定義一個(gè)固定的值集合,并為每個(gè)值分配一個(gè)名稱,枚舉類型提供了一種簡單、安全和可讀性強(qiáng)的方式來表示一組相關(guān)的常量,需要的朋友可以參考下
    2023-10-10
  • Intellij IDEA 旗艦版創(chuàng)建 Spring MVC 項(xiàng)目踩過的坑

    Intellij IDEA 旗艦版創(chuàng)建 Spring MVC 項(xiàng)目踩過的坑

    IDEA旗艦版可以直接創(chuàng)建Spring MVC項(xiàng)目,但創(chuàng)建后的項(xiàng)目并不是直接就可以運(yùn)行,還需要進(jìn)行一些配置。這篇文章主要介紹了Intellij IDEA 旗艦版創(chuàng)建 Spring MVC 項(xiàng)目踩坑記 ,需要的朋友可以參考下
    2020-03-03
  • SpringMVC 上傳文件 MultipartFile 轉(zhuǎn)為 File的方法

    SpringMVC 上傳文件 MultipartFile 轉(zhuǎn)為 File的方法

    這篇文章主要介紹了SpringMVC 上傳文件 MultipartFile 轉(zhuǎn)為 File的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 解決netty中spring對(duì)象注入失敗的問題

    解決netty中spring對(duì)象注入失敗的問題

    這篇文章主要介紹了解決netty中spring對(duì)象注入失敗的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java單例的寫法詳解

    Java單例的寫法詳解

    在java中,單例有很多種寫法,面試時(shí),手寫代碼環(huán)節(jié),除了寫算法題,有時(shí)候也會(huì)讓手寫單例模式,這里記錄一下單例的幾種寫法和優(yōu)缺點(diǎn)。需要的朋友可以參考下
    2021-09-09
  • Java中Stream?API的使用示例詳解

    Java中Stream?API的使用示例詳解

    Java?在?Java?8?中提供了一個(gè)新的附加包,稱為?java.util.stream,該包由類、接口和枚舉組成,允許對(duì)元素進(jìn)行函數(shù)式操作,?本文主要介紹了Java中Stream?API的具體使用,感興趣的小伙伴可以了解下
    2023-11-11
  • springBoot 項(xiàng)目排除數(shù)據(jù)庫啟動(dòng)方式

    springBoot 項(xiàng)目排除數(shù)據(jù)庫啟動(dòng)方式

    這篇文章主要介紹了springBoot 項(xiàng)目排除數(shù)據(jù)庫啟動(dòng)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Spring注解中@Configuration和@Component到底有啥區(qū)別

    Spring注解中@Configuration和@Component到底有啥區(qū)別

    之前一直搞不清@Component和@Configuration這兩個(gè)注解到底有啥區(qū)別,一直認(rèn)為被這兩修飾的類可以被Spring實(shí)例化嘛,最近終于弄明白了,這篇文章主要給大家介紹了關(guān)于Spring注解中@Configuration和@Component到底有啥區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • Java中ArrayList去除重復(fù)元素(包括字符串和自定義對(duì)象)

    Java中ArrayList去除重復(fù)元素(包括字符串和自定義對(duì)象)

    本文主要介紹了Java中ArrayList去除重復(fù)元素(包括字符串和自定義對(duì)象)的方法。具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-03-03

最新評(píng)論