摘要:比如需要用多線程或分布式集群統計一堆用戶的相關統計值,由于用戶的統計值是共享數據,因此需要保證線程安全。如果類是無狀態的,那它永遠是線程安全的。參考探索并發編程二寫線程安全的代碼
線程安全類 保證類線程安全的措施:
不共享線程間的變量;
設置屬性變量為不可變變量;
每個共享的可變變量都使用一個確定的鎖保護;
保證線程安全的思路: 1. 通過架構設計通過上層的架構設計和業務分析來避免并發場景。比如需要用多線程或分布式集群統計一堆用戶的相關統計值,由于用戶的統計值是共享數據,因此需要保證線程安全。從業務上分析出用戶之間的數據并不共享,因此可以設計一個規則來保證一個用戶的計算工作和數據訪問只被一個線程或一臺機器完成,這樣從設計上避免了接下來可能的并發問題。
2. 保證類無狀態有狀態會限制橫向擴展能力,也可能產生并發問題。如果類是無狀態的,那它永遠是線程安全的。因此在設計階段盡可能用無狀態的類來滿足業務需求。
3. 區別原子操作和復合操作常見的復合操作包括check-then-act, i++等。雖然check-then-act從表面上看很簡單,但卻普遍存在與我們日常的開發中,特別是在數據庫存取這一塊。比如我們需要在數據庫里存一個客戶的統計值,當統計值不存在時初始化,當存在時就去更新。如果不把這組邏輯設計為原子性的就很有可能產生出兩條這個客戶的統計值。
在單機環境下處理這個問題還算容易,通過鎖或者同步來把這組復合操作變為原子操作,但在分布式環境下就不適用了。一般情況下是通過在數據庫端做文章,比如通過唯一性索引或者悲觀鎖來保障其數據一致性。當然任何方案都是有代價的,這就需要具體情況下來權衡。
使用鎖應注意:
每個共享變量必須由一個確定的鎖保護。
使用鎖會有性能損失
鎖不能解決在分布式環境共享變量的并發問題。
參考:探索并發編程(二)------寫線程安全的Java代碼
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65162.html
摘要:線程池的作用降低資源消耗。通過重復利用已創建的線程降低線程創建和銷毀造成的資源浪費。而高位的部分,位表示線程池的狀態。當線程池中的線程數達到后,就會把到達的任務放到中去線程池的最大長度。默認情況下,只有當線程池中的線程數大于時,才起作用。 線程池的作用 降低資源消耗。通過重復利用已創建的線程降低線程創建和銷毀造成的資源浪費。 提高響應速度。當任務到達時,不需要等到線程創建就能立即執行...
摘要:物理計算機并發問題在介紹內存模型之前,先簡單了解下物理計算機中的并發問題。基于高速緩存的存儲交互引入一個新的問題緩存一致性。寫入作用于主內存變量,把操作從工作內存中得到的變量值放入主內存的變量中。 物理計算機并發問題 在介紹Java內存模型之前,先簡單了解下物理計算機中的并發問題。由于處理器的與存儲設置的運算速度有幾個數量級的差距,所以現代計算機加入一層讀寫速度盡可能接近處理器的高速緩...
摘要:并發需要解決的問題功能性問題線程同步面臨兩個問題,想象下有兩個線程在協作工作完成某項任務。鎖可用于規定一個臨界區,同一時間臨界區內僅能由一個線程訪問。并發的數據結構線程安全的容器,如等。 并發指在宏觀上的同一時間內同時執行多個任務。為了滿足這一需求,現代的操作系統都抽象出 線程 的概念,供上層應用使用。 這篇博文不打算詳細展開分析,而是對java并發中的概念和工具做一個梳理。沿著并發模...
摘要:內存模型是圍繞著在并發過程中如何處理原子性可見性和有序性這個特征來建立的,我們來看下哪些操作實現了這個特性。可見性可見性是指當一個線程修改了共享變量的值,其他線程能夠立即得知這個修改。 Java內存模型是圍繞著在并發過程中如何處理原子性、可見性和有序性這3個特征來建立的,我們來看下哪些操作實現了這3個特性。 原子性(atomicity): 由Java內存模型來直接保證原子性變量操作包括...
摘要:禁止指令重排序優化。只有當線程對變量執行的前一個動作是時,才能對執行動作并且,只有當對變量執行的后一個動作是時,線程才能對變量執行動作。變量不需要與其他的狀態變量共同參與不變約束。在某些情況下,的同步機制性要優于鎖。 當一個變量定義為volatile之后,它具備兩種特性: 保證此變量對所有線程的可見性,這里的可見性是指當一條線程修改了這個變量的值,新值對于其他線程來說是可以立即得知的...
閱讀 1399·2021-09-02 09:53
閱讀 2667·2021-07-29 13:50
閱讀 1715·2019-08-30 11:07
閱讀 1571·2019-08-30 11:00
閱讀 1450·2019-08-29 14:00
閱讀 1844·2019-08-29 12:52
閱讀 2560·2019-08-29 11:11
閱讀 3415·2019-08-26 12:23