搜尋
首頁Javajava教程Java中關於單例模式線程安全問題的解決方法

Java中關於單例模式線程安全問題的解決方法

Sep 15, 2017 am 10:36 AM
java安全執行緒

這篇文章主要介紹了Java 單例模式線程安全問題的相關資料,希望透過本文大家能了解掌握單例模式中線程安全的使用方法,需要的朋友可以參考下

#Java 單例模式執行緒安全性問題

SpringIOC容器預設提供bean的存取作用域是單例模式。即在整個application生命週期中,只有一個instance。因此在多執行緒並發下,會有執行緒安全風險。我們在MVC框架下的servlet就是線程安全的。由於該servlet是在客戶端,多並發相對少,但是對於web service端,則需要考慮到。

ThreadLocal類別:為每個執行緒提供了一個獨立的變數(實例)副本,從各將各個不同的實例存取isolation。
在同步鎖定機制中,後來者執行緒等待先行執行緒完成後,才能存取該成員變數。而ThreadLocal實作實例的複製而隔離物件存取資料衝突。同時也能夠少量解決scope為prototype存取模式下大量實例生命週期管理的消耗和負擔。是「以時間換空間」和「以空間換時間」的兩種實現。前者僅提供唯一變量,讓不同的線程排隊訪問,而後者為每一個線程都提供了一份拷貝,因此可以同時訪問而互不影響,同時該拷貝存儲於內存中,下次再次訪問時候不再重新產生實例,減少伺服器資源消耗。 

我們知道在一般情況下,只有無狀態的Bean才可以在多執行緒環境下共享,在Spring中,絕大部分Bean都可以宣告為singleton作用域。就是因為Spring對某些Bean(如RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder等)中非線程安全狀態採用ThreadLocal進行處理,讓它們也成為線程安全的狀態,因為有狀態的Bean就可以在多線程中共享了。

線程安全性問題:由全域變數及靜態變數引起,若每個執行緒中對全域變數、靜態變數只有讀取操作,而無寫操作,一般來說,這個全域變數是執行緒安全的;若有多個執行緒同時執行寫入操作,一般都需要考慮執行緒同步,否則就可能影響執行緒安全性。

1) 常數永遠是線程安全的 (值恆定)
2)每次呼叫方法前都新建一個實例是線程安全的。 (不同實例相互隔離)
3)局部變數是線程安全的(隔離)

因為每執行一個方法,都會在獨立的空間創建局部變量,它不是共享的資源。局部變數包括方法的參數變數和方法內變數。

有狀態:有資料儲存、變更功能。有狀態物件(Stateful Bean),有實例變數的物件  ,可以保存數據,是非線程安全的。

無狀態:就是一次操作,不能變更資料。無狀態對象(Stateless Bean),沒有實例變數的對象,不能保存數據,是不變類,是線程安全的。在spring中單例模式是共享實例,以達到提高效能。有狀態的Bean,多執行緒環境下不安全,那麼適合用Prototype原型模式。 Prototype: 每次對bean的請求都會建立一個新的bean實例。

以上是Java中關於單例模式線程安全問題的解決方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?Mar 17, 2025 pm 05:46 PM

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)?如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)?Mar 17, 2025 pm 05:45 PM

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存?如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存?Mar 17, 2025 pm 05:44 PM

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?Mar 17, 2025 pm 05:43 PM

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?Mar 17, 2025 pm 05:35 PM

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版