java 可見度簡單總結

來源:互聯網
上載者:User

標籤:ati   而且   wap   完成   swap   簡單   使用   版本   JD   

Java 可見度記憶體模型
  • 主存
    • 所有線程都可以訪問
  • 本地記憶體
    • 每個線程私人的記憶體
- java 的所有變數都儲存在主記憶體中- 每個線程有自己獨的工作記憶體,儲存了該線程使用到的變數副本,是對主記憶體中變數的一份拷貝- 每個線程不能訪問其他線程的工作記憶體,線程間變數傳遞需要通過主記憶體來完成- 每個線程不能直接操作主存,只能把主存的內容拷貝到本地記憶體後再做操作(這是線程不安全的本質),然後寫回主存
可見度的方法volatile

這種方式可以保證每次取數直接從主存取

它只能保證記憶體的可見度,無法保證原子性

它不需要加鎖,比 synchronized 更輕量級,不會阻塞線程

不會被編譯器最佳化

然而要求對這個變數做原子操作,否則還是會有問題

雖然 volatile 是輕量級,但是它也需要保證 讀寫的順序不亂序,所以可以有最佳化點,比如在單例實現方式中的雙重校正中,使用 臨時變數 降低 volatile 變數的訪問。

synchronized

Synchronized 能夠實現原子性和可見度;在 Java 記憶體模型中,synchronized規 定,線程在加鎖時,先清空工作記憶體 → 在主記憶體中拷貝最新變數的副本到工作記憶體 → 執行完代碼 → 將更改後的共用變數的值重新整理到主記憶體中 → 釋放互斥鎖。

所以如果無法用 volatile 做可見度,則可以考慮用 synchronized 可以做可見度的保證

AtomicXXX

jdk 提供了很多原子類型,這種類型的基本原理總結起來,volatile + unsafe 的 Compare and Swap,這種 Unsafe 操作並不推薦在自己的代碼中使用,因為各 JDK 版本在這裡變化較大,有可能升級 JDK 時造成各種問題。而且也要保證自己能夠用好。

LongAdder

待補充

java 可見度簡單總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.