摘要:如果你知道該成員變量會被多個線程訪問,如計數器價格等,你最好是將其設置為。但是對一個型的或變量的讀寫是原子。一種實踐是用修飾和變量,使其能按原子類型來讀寫。修復符的另一個作用是提供內存屏障,例如在分布式框架中的應用。
volatile能使得一個非原子操作變成原子操作嗎?
一個典型的例子是在類中有一個 long 類型的成員變量。如果你知道該成員變量會被多個線程訪問,如計數器、價格等,你最好是將其設置為 volatile。為什么?因為 Java 中讀取 long 類型變量不是原子的,需要分成兩步,如果一個線程正在修改該 long 變量的值,另一個線程可能只能看到該值的一半(前 32 位)。但是對一個 volatile 型的 long 或 double 變量的讀寫是原子。
一種實踐是用 volatile 修飾 long 和 double 變量,使其能按原子類型來讀寫。double 和 long 都是64位寬,因此對這兩種類型的讀是分為兩部分的,第一次讀取第一個 32 位,然后再讀剩下的 32 位,這個過程不是原子的,但 Java 中 volatile 型的 long 或 double 變量的讀寫是原子的。volatile 修復符的另一個作用是提供內存屏障(memory barrier),例如在分布式框架中的應用。簡單的說,就是當你寫一個 volatile 變量之前,Java 內存模型會插入一個寫屏障(write barrier),讀一個 volatile 變量之前,會插入一個讀屏障(read barrier)。意思就是說,在你寫一個 volatile 域時,能保證任何線程都能看到你寫的值,同時,在寫之前,也能保證任何數值的更新對所有線程是可見的,因為內存屏障會將其他所有寫的值更新到緩存。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74537.html
摘要:如何擁有可見性先介紹一下內存模型中定義的種工作內存與主內存之間的原子操作鎖定作用于主內存的變量,把一個變量標識為一條線程獨占的狀態。并沒有達到期望的。 前言 要學習好Java的多線程,就一定得對volatile關鍵字的作用機制了熟于胸。最近博主看了大量關于volatile的相關博客,對其有了一點初步的理解和認識,下面通過自己的話敘述整理一遍。 有什么用? volatile主要對所修飾的...
摘要:當某個不應該發布的對象被發布時,這種情況被稱為逸出。線程安全共享線程安全的對象在其內部實現同步,因此多線程可以通過對象的公有接口來進行訪問而不需要進一步的同步。 前言 本系列博客是對《Java并發編程實戰》的一點總結,本篇主要講解以下幾個內容,內容會比較枯燥。可能大家看標題不能能直觀的感受出到底什么意思,這就是專業術語,哈哈,解釋下,術語(terminology)是在特定學科領域用...
摘要:但是不管怎樣,在一個線程已經獲取鎖后,在釋放前再次獲取鎖是一個合理的需求,而且并不生硬。那么如果考慮重入,也很簡單,在加鎖時將的值累加即可,表示同一個線程重入此鎖的次數,當歸零,即表示釋放完畢。 前言 最近研究了一下juc包的源碼。在研究ReentrantReadWriteLock讀寫鎖的時候,對于其中一些細節的思考和處理以及關于提升效率的設計感到折服,難以遏制想要分享這份心得的念頭,...
摘要:但是不管怎樣,在一個線程已經獲取鎖后,在釋放前再次獲取鎖是一個合理的需求,而且并不生硬。那么如果考慮重入,也很簡單,在加鎖時將的值累加即可,表示同一個線程重入此鎖的次數,當歸零,即表示釋放完畢。 前言 最近研究了一下juc包的源碼。在研究ReentrantReadWriteLock讀寫鎖的時候,對于其中一些細節的思考和處理以及關于提升效率的設計感到折服,難以遏制想要分享這份心得的念頭,...
摘要:總結我們主要介紹到了以下幾種方式實現單例模式餓漢方式線程安全懶漢式非線程安全和關鍵字線程安全版本懶漢式雙重檢查加鎖版本枚舉方式參考設計模式中文版第二版設計模式深入理解單例模式我是一個以架構師為年之內目標的小小白。 初遇設計模式在上個寒假,當時把每個設計模式過了一遍,對設計模式有了一個最初級的了解。這個學期借了幾本設計模式的書籍看,聽了老師的設計模式課,對設計模式算是有個更進一步的認識。...
閱讀 2331·2021-11-24 10:27
閱讀 3576·2019-08-30 15:55
閱讀 3341·2019-08-30 15:53
閱讀 2342·2019-08-29 17:27
閱讀 1428·2019-08-26 13:47
閱讀 3547·2019-08-26 10:28
閱讀 913·2019-08-23 15:59
閱讀 2850·2019-08-23 15:19