最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中Spring的單例模式使用

 更新時間:2022年01月26日 17:47:44   作者:JavaEdge.??  
這篇文章主要介紹了Java中Spring的單例模式使用,spring中的單例也不影響應(yīng)用并發(fā)訪問。大多數(shù)時候客戶端都在訪問我們應(yīng)用中的業(yè)務(wù)對象,為減少并發(fā)控制,不應(yīng)該在業(yè)務(wù)對象中設(shè)置那些容易造成出錯的成員變量,下面一起進入文章了解更多詳細內(nèi)容吧

1.spring單例 V.S 設(shè)計模式的單例

  • 設(shè)計模式單例,在整個應(yīng)用中只有一個實例
  • spring單例,在一個IoC容器中只有一個實例

spring中的單例也不影響應(yīng)用并發(fā)訪問。大多數(shù)時候客戶端都在訪問我們應(yīng)用中的業(yè)務(wù)對象,為減少并發(fā)控制,不應(yīng)該在業(yè)務(wù)對象中設(shè)置那些容易造成出錯的成員變量。

2.成員變量的解決方式

  • 方法的參數(shù),局部變量(相當(dāng)于new)
  • threadlocal、設(shè)置bean scope=prototype

Spring Bean Scope 有狀態(tài)的Bean與無狀態(tài)的Bean

3.Spring并發(fā)問題

一般無狀態(tài)的Bean才可在多線程環(huán)境下共享,Spring Bean默認為singleton作用域。

那有狀態(tài)bean呢?Spring對一些如

  • RequestContextHolder
  • TransactionSynchronizationManager
  • LocaleContextHolder

非線程安全狀態(tài)Bean采用ThreadLocal,讓它們也成為線程安全的狀態(tài)。

如用有狀態(tài)bean,也可使用prototype模式,每次在注入時,就重新創(chuàng)建一個bean,在多線程中互不影響。

Eic-server所有的業(yè)務(wù)對象中的成員變量如:

  • Dao中的xxxDao
  • controller中的xxxService

都會被多個線程共享,那這些對象不會出現(xiàn)同步問題嗎?比如造成DB插入,更新異常?

實體bean,從客戶端傳遞到后臺controller=》service=>Dao流程中,他們這些對象都是單例的,那這些單例對象在處理我們的傳遞到后臺的實體bean不會出問題嗎?(實體bean在多線程中的解決方案)
因為實體bean不是單例的,他們并沒有交給Spring管理!每次我們都手動的New出來的,如BigObject bo = new BigObject(),所以即使是那些處理我們提交數(shù)據(jù)的業(yè)務(wù)處理類是被多線程共享,但他們處理的數(shù)據(jù)并不共享,數(shù)據(jù)是每個線程都有自己的一份,所以在數(shù)據(jù)方面不會出現(xiàn)線程安全問題。

4.對實體bean在多線程中的處理

  • 對實體bean一般通過方法參數(shù)的的形式傳遞(參數(shù)是局部變量),所以多線程間不會有影響
  • 有的地方對有狀態(tài)的bean直接使用prototype
  • 對使用bean的地方,可通過new創(chuàng)建
  1. 在Dao中的xxxDao
  2. controller中的xxxService

這些對象都是單例,那就不會出現(xiàn)線程同步問題。這些對象雖被多線程并發(fā)訪問,可我們訪問的是他們里面的方法,而這些類里面通常不會有成員變量。所以出問題的是系統(tǒng)里面的業(yè)務(wù)對象,務(wù)必注意這些業(yè)務(wù)對象里,千萬不能有獨立的成員變量,否則會出錯。

所以我們在應(yīng)用中的業(yè)務(wù)對象如下:

controller中的成員變量List和paperService:

service里的成員變量ibatisEntityDao:

雖然這個應(yīng)用有成員變量,但不會出現(xiàn)線程安全問題:

  • controller里的成員變量private TestPaperService papersService 之所以會成為成員變量,我們的目的是注入,將其實例化進而訪問里面的方法
  • private static final int List = 0;是final的不會被改變
  • service里面的private IbatisEntityDao ibatisEntityDao;是框架本身的,線程同步問題已解決

5.spring無狀態(tài)的支持

Spring框架對單例的支持是采用單例注冊表。

6.spring有狀態(tài)的支持

spring如何實現(xiàn)那些個有狀態(tài)bean,如RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder]的線程安全,即使用ThreadLocal實現(xiàn)的

7.ThreadLocal

當(dāng)使用ThreadLocal維護變量(僅是變量,因為線程同步問題就是成員變量的互斥訪問出問題)時,ThreadLocal為每個使用該變量的線程提供獨立的變量副本,所以每個線程都可獨立改變自己的副本,而不會影響其它線程所對應(yīng)副本。

從線程角度看,就好像每一個線程都完全擁有該變量,這其實就將共享變相為人手一份。雖使用ThreadLocal帶來更多內(nèi)存開銷,但這點開銷還微不足道。因為保存在ThreadLocal中的對象,通常較小。

initialValue(),protected的方法,為子類重寫而實現(xiàn)。該方法返回當(dāng)前線程在該線程局部變量的初始值,是個延遲調(diào)用方法,在一個線程第1次調(diào)用get()或set(Object)時才執(zhí)行且僅執(zhí)行1次。

8.ThreadLocal使用

要給線程初始化一個特殊值時,需要自己實現(xiàn)ThreadLocal的子類并重寫該方法,通常使用一個內(nèi)部匿名類對ThreadLocal進行子類化,

EasyDBO中創(chuàng)建jdbc連接上下文就是這樣做的:

簡單實現(xiàn)版本:

9.ThreadLocal V.S synchronized

為保證多個線程對共享變量的安全訪問,通常會使用synchronized保證同時只有一個線程對共享變量進行操作。但有些情況下,synchronized不能保證多線程對共享變量的正確讀寫。

例如類有個類變量,該類變量會被多個類方法讀寫,當(dāng)多線程操作該類的實例對象時,若線程對類變量有讀取、寫入操作就會發(fā)生類變量讀寫錯誤,即便是在類方法前加上synchronized也無效,因為同一個線程在兩次調(diào)用方法之間時鎖是被釋放的,這時其它線程可訪問對象的類方法,讀取或修改類變量。這種情況下可以將類變量放到ThreadLocal中,使變量在每個線程中都有獨立拷貝,不會出現(xiàn)一個線程讀取變量時而被另一個線程修改的現(xiàn)象。

多線程訪問對于類變量和ThreadLocal變量的影響,QuerySvc分別設(shè)置:

  • 類變量sql
  • ThreadLocal變量

使用時先創(chuàng)建QuerySvc的一個實例對象,然后產(chǎn)生多個線程,分別設(shè)置不同sql實例對象,再調(diào)用execute,讀取sql的值,看是否是set方法中寫入的值。這類似web應(yīng)用中多個請求線程攜帶不同查詢條件對一個servlet實例的訪問,然后servlet調(diào)用業(yè)務(wù)對象,并傳入不同查詢條件,最后要保證每個請求得到的結(jié)果是對應(yīng)的查詢條件的結(jié)果。

使用QuerySvc的工作線程如下:

運行線程:

先創(chuàng)建一個QuerySvc實例對象,然后創(chuàng)建若干線程來調(diào)用QuerySvc的set和execute方法,每個線程傳入的sql都不一樣,sql變量中值不能保證在execute中值和set設(shè)置的值一樣,在web應(yīng)用中就表現(xiàn)為一個用戶查詢的結(jié)果不是自己的查詢條件返回的結(jié)果,而是另一個用戶查詢條件的結(jié)果。

而ThreadLocal中的值總是和set中設(shè)置的值一樣,這樣通過使用ThreadLocal獲得了線程安全性。

小結(jié):

若一個對象要被多個線程訪問,而該對象存在類變量被不同類方法讀寫,為獲得線程安全,可以用ThreadLocal替代類變量。

ThreadLocal和線程同步機制相比有什么優(yōu)勢呢?

ThreadLocal和線程同步機制都是為了解決多線程中相同變量的訪問沖突問題。

同步機制中,通過對象的鎖機制保證同一時間只有一個線程訪問變量。

這時該變量是多個線程共享的,使用同步機制要分析:

  • 什么時候?qū)ψ兞窟M行讀寫
  • 什么時候需要鎖定某個對象
  • 什么時候釋放對象鎖等繁雜的問題

ThreadLocal為每個線程提供一個獨立變量副本,隔離多線程對數(shù)據(jù)的訪問沖突。ThreadLocal采用“以空間換時間”。

10.Spring使用ThreadLocal解決線程安全問題

一般只有無狀態(tài)Bean才能在多線程下共享,在Spring中,絕大部分Bean都可以聲明為singleton作用域。因為Spring對一些Bean(如RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder等)中非線程安全狀態(tài)采用ThreadLocal進行處理,讓它們也成為線程安全的狀態(tài),有狀態(tài)Bean就能在多線程中共享了。

一般Web應(yīng)用劃分為展現(xiàn)層、服務(wù)層和持久層三個層次,從接收請求到返回響應(yīng)所經(jīng)過的所有程序調(diào)用都同屬于一個線程。這就能根據(jù)需要,將一些非線程安全的變量以ThreadLocal存放,在同一次請求響應(yīng)的調(diào)用線程中,所有關(guān)聯(lián)的對象引用到的都是同一個變量。

ThreadLocal是解決線程安全問題一個很好的思路,它通過為每個線程提供一個獨立的變量副本解決了變量并發(fā)訪問的沖突問題。在很多情況下,ThreadLocal比直接使用synchronized同步機制解決線程安全問題更簡單,更方便,且結(jié)果程序擁有更高的并發(fā)性。

到此這篇關(guān)于Java中Spring的單例模式使用的文章就介紹到這了,更多相關(guān)Spring的單例模式使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring中@Async用法詳解及簡單實例

    Spring中@Async用法詳解及簡單實例

    這篇文章主要介紹了Spring中@Async用法詳解及簡單實例的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • IO 使用說明介紹

    IO 使用說明介紹

    本篇文章小編為大家介紹,IO 使用說明介紹。需要的朋友參考下
    2013-04-04
  • 基于SpringBoot集成測試遠程連接Redis服務(wù)的教程詳解

    基于SpringBoot集成測試遠程連接Redis服務(wù)的教程詳解

    這篇文章主要介紹了基于SpringBoot集成測試遠程連接的Redis服務(wù)的相關(guān)知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • SpringBoot敏感數(shù)據(jù)脫敏的處理方式

    SpringBoot敏感數(shù)據(jù)脫敏的處理方式

    在Spring Boot中處理敏感數(shù)據(jù)脫敏,可以通過以下幾種方式實現(xiàn),確保敏感信息在接口返回、日志輸出、數(shù)據(jù)庫存儲等環(huán)節(jié)得到保護,文中通過代碼示例講解的非常詳細,需要的朋友可以參考下
    2025-03-03
  • 詳解Netty編碼器和解碼器

    詳解Netty編碼器和解碼器

    很多小伙伴對Netty編解碼器這方面不是很了解,今天這篇文章給大家詳細介紹了Netty編碼器和解碼器的相關(guān)知識,需要的朋友可以參考下
    2021-06-06
  • Java讀取Properties文件的七種方法的總結(jié)

    Java讀取Properties文件的七種方法的總結(jié)

    這篇文章主要介紹了Java讀取Properties文件的七種方法的總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • Java讀取xml文件的五種方式

    Java讀取xml文件的五種方式

    在編寫與 XML 數(shù)據(jù)交互的現(xiàn)代軟件應(yīng)用時,有效地讀取和解析 XML 文件是至關(guān)重要的,本文旨在探討 Java 中處理 XML 文件的五種主要方法:DOM、SAX、StAX、JAXB 和 JDOM,我們將詳細介紹每種方法的工作原理、典型用途以及如何在 Java 程序中實現(xiàn)它們
    2024-05-05
  • 寫了兩年代碼之后再來談一談Spring中的Bean

    寫了兩年代碼之后再來談一談Spring中的Bean

    這篇文章主要介紹了寫了兩年代碼之后再來看看Spring中的Bean,這里列出四種常用的添加Bean的方式,介紹最基本的@Bean注解,@Bean注解聲明這個類是一個Bean,需要的朋友可以參考下
    2021-10-10
  • @PathVariable注解,讓spring支持參數(shù)帶值功能的案例

    @PathVariable注解,讓spring支持參數(shù)帶值功能的案例

    這篇文章主要介紹了@PathVariable注解,讓spring支持參數(shù)帶值功能的案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • springboot整合solr的方法詳解

    springboot整合solr的方法詳解

    這篇文章主要介紹了springboot整合solr的方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08

最新評論

饶平县| 宿松县| 牟定县| 泸溪县| 车致| 班玛县| 如东县| 宜城市| 剑河县| 林口县| 临海市| 西充县| 江川县| 砚山县| 庄浪县| 皋兰县| 姚安县| 若尔盖县| 务川| 临潭县| 朝阳县| 花莲县| 诸城市| 大安市| 虎林市| 日喀则市| 鲁山县| 淮滨县| 安乡县| 禹州市| 文昌市| 平江县| 万宁市| 建昌县| 新乡县| 鹿邑县| 桑植县| 沙河市| 冷水江市| 乌恰县| 永城市|