摘要:線程封閉當(dāng)訪問共享的可變數(shù)據(jù)時(shí),通常需要使用同步。如果僅在單線程內(nèi)訪問數(shù)據(jù),就不要同步。這種技術(shù)成為線程封閉。棧封閉棧封閉是線程封閉的一種特例,在棧封閉中,只能通過局部變量才能訪問對象。,對象是正確創(chuàng)建的。
線程封閉
當(dāng)訪問共享的可變數(shù)據(jù)時(shí),通常需要使用同步。一種避免使用同步的方式就是不共享數(shù)據(jù)。如果僅在單線程內(nèi)訪問數(shù)據(jù),就不要同步。這種技術(shù)成為線程封閉(Thread Confinement)。Ad-hoc 線程封閉
Ad-hoc 線程封閉是指維護(hù)線程封閉的職責(zé)完全是由程序自己來承擔(dān)。棧封閉
棧封閉是線程封閉的一種特例,在棧封閉中,只能通過局部變量才能訪問對象。ThreadLocal類
ThreadLocal提供了set和get等訪問接口或方法,這些方法為每個(gè)使用該變量的線程都存有一份獨(dú)立的副本,因此get總是返回由當(dāng)前執(zhí)行線程在調(diào)用set設(shè)置的最新值。
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; /** * ConnectionDispenser * * Using ThreadLocal to ensure thread confinement * * @author Brian Goetz and Tim Peierls */ public class ConnectionDispenser { static String DB_URL = "jdbc:mysql://localhost/mydatabase"; private ThreadLocal不變性connectionHolder = new ThreadLocal () { public Connection initialValue() { try { return DriverManager.getConnection(DB_URL); } catch (SQLException e) { throw new RuntimeException("Unable to acquire Connection, e"); } }; }; public Connection getConnection() { return connectionHolder.get(); } }
滿足同步需求的另一種方法是使用不可變對象。1,對象創(chuàng)建以后其狀態(tài)就不能修改。2,對象的所有域都是final類型。3,對象是正確創(chuàng)建的。
Final域關(guān)鍵字final可以視為C++中const機(jī)制的一種受限版本,用于構(gòu)造不可變對象。 (引用不可變,引用的對象是可變的)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/74403.html
摘要:對象的組合介紹一些組合模式,這些模式能夠使一個(gè)類更容易成為線程安全的,并且維護(hù)這些類時(shí)不會無意破壞類的安全性保證。狀態(tài)變量的所有者將決定采用何種加鎖協(xié)議來維持變量狀態(tài)的完整性。所有權(quán)意味著控制權(quán)。 對象的組合 介紹一些組合模式,這些模式能夠使一個(gè)類更容易成為線程安全的,并且維護(hù)這些類時(shí)不會無意破壞類的安全性保證。 設(shè)計(jì)線程安全的類 在設(shè)計(jì)線程安全類的過程中,需要包含以下三個(gè)基本要素: ...
摘要:無狀態(tài)的是線程安全的,當(dāng)無狀態(tài)變?yōu)橛袪顟B(tài)時(shí)就是不安全的破壞了線程的安全性,非原子性操作競態(tài)條件在并發(fā)編程中,由于不恰當(dāng)?shù)膱?zhí)行時(shí)序而出現(xiàn)的不正確結(jié)果是一種非常重要的情況,被稱之為競態(tài)條件。重入意味著獲取鎖的操作的粒度是線程,而不是調(diào)用。 這本書的內(nèi)容是什么? 本書提供了各種實(shí)用的設(shè)計(jì)規(guī)則,用于幫助開發(fā)人員創(chuàng)建安全的和高性能的并發(fā)類。 什么類是線程安全的? 當(dāng)多個(gè)線程訪問某...
摘要:對象的共享上一章介紹了如何通過同步來避免多個(gè)線程在同一時(shí)刻訪問相同的數(shù)據(jù),而本章將介紹如何共享和發(fā)布對象,從而使它們能夠安全地由多個(gè)線程同時(shí)訪問。為了確保多個(gè)線程的之間對內(nèi)存寫入操作的可見性,必須使用同步機(jī)制。 對象的共享 上一章介紹了如何通過同步來避免多個(gè)線程在同一時(shí)刻訪問相同的數(shù)據(jù),而本章將介紹如何共享和發(fā)布對象,從而使它們能夠安全地由多個(gè)線程同時(shí)訪問。 列同步代碼塊和同步方法可...
摘要:上集算法實(shí)現(xiàn)的優(yōu)點(diǎn)當(dāng)一個(gè)線程執(zhí)行任務(wù)失敗不影響其他線程的進(jìn)行最大限度的利用資源能提高程序的伸縮性伸縮性不修改任何代碼升級硬件就能帶來性能上的提高升級硬件帶來的性能提高明顯就是伸縮性良好的缺點(diǎn)代碼復(fù)雜影響閱讀性剛開始看的時(shí)候沒有正確的思路理解 ConcurrentLinkedQueue(上集) 算法實(shí)現(xiàn) CAS CAS的優(yōu)點(diǎn) 當(dāng)一個(gè)線程執(zhí)行任務(wù)失敗不影響其他線程的進(jìn)行 最大限度的利用...
摘要:過程是一個(gè)計(jì)算單元,計(jì)算是通過通訊來完成的。標(biāo)題的表達(dá)式里還有一個(gè)符號,表示一個(gè)無行為的過程。一個(gè)過程的是它和外部產(chǎn)生行為交互的唯一方式。所以如果兩個(gè)過程需要通過一個(gè)交互,這個(gè)必須在兩個(gè)過程中都是,其中一方用于發(fā)送,另一方用于接收。 這篇文章的標(biāo)題是一個(gè)π表達(dá)式,結(jié)尾是一段JavaScript代碼,和這個(gè)表達(dá)式的含義完全一致,或者說,完成了這個(gè)表達(dá)式的估值。 π演算(π calculu...
閱讀 2998·2021-11-23 09:51
閱讀 2820·2021-11-11 16:55
閱讀 2935·2021-10-14 09:43
閱讀 1403·2021-09-23 11:22
閱讀 1045·2019-08-30 11:04
閱讀 1674·2019-08-29 11:10
閱讀 969·2019-08-27 10:56
閱讀 3124·2019-08-26 12:01