摘要:線程和進程的區別可見性一個線程對共享變量值的修改,能夠及時的被其他線程看到。共享變量如果一個變量在多個線程的工作內存中都存在副本,那么這個變量就是這幾個線程的共享變量。
線程和進程的區別
可見性
一個線程對共享變量值的修改,能夠及時的被其他線程看到。
共享變量
如果一個變量在多個線程的工作內存中都存在副本,那么這個變量就是這幾個線程的共享變量。
java內存模型
Java memory model 描述了java程序中各種變量(線程共享變量)的訪問規則,
以及在JVM中將變量存儲到內存,以及從內存中讀取變量的底層細節。
所有的變量都存儲在主內存中
每個線程都有自己獨立的工作內存,里面保存了該線程使用到的變量副本(主內存中該變量的一個拷貝)
線程對共享變量的所有的操作都必須在自己的工作內存中進行,不能直接從主內存中讀取
不同線程之間無法直接訪問其他線程工作內存中的變量,線程間變量值的傳遞需要通過住內存來完成。
線程1對共享變量的修改要想被線程2及時的看到,必須要經過2個步驟:
把工作內存1中更新過的共享變量刷新到主內存中。
將主內存中最新的共享變量的值更新到工作內存2中
可見性的實現方式:
synchronized
原子性(同步)
可見性
JMM關于synchronized的兩條規定
解鎖之前,必須把共享變量的最新值刷新到主內存中
線程加鎖時,將清空工作內存中共享變量的值,從而使用共享變量時需要從主內存中重新讀取最新值(枷鎖和解鎖需要是同一把鎖)
線程解鎖前對共享變量的修改在下次加鎖的時候對其他線程可見。
線程執行互斥代碼的過程:
1,獲得互斥鎖
2,清空工作內存
3,從主內存拷貝變量的最新副本到工作內存
4,執行代碼
5,將更改后的共享變量值刷新到主內存
6,釋放互斥鎖
重排序
代碼書寫的順序與實際執行的順序不同,指令重排序是編譯器或是處理器為提高程序的性能而做的優化
1,編譯器優化的重排序(編譯器優化)
2,指令級并行重排序(處理器優化)
3,內存系統重排序(處理器優化)
as-if-serial:無論如何重排序,程序執行的結果應該與代碼順序執行的結果一致
volatile
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/64743.html
摘要:閱讀本文約分鐘上一次我們說到互斥代碼的實現過程,如果有忘記或不清楚的可以去上篇看看。貓說多線程之內存可見性上篇今天我們了解下重排序。 閱讀本文約3分鐘 上一次我們說到synchronized互斥代碼的實現過程,如果有忘記或不清楚的可以去上篇看看。【Java貓說】Java多線程之內存可見性(上篇) 今天我們了解下重排序。 其使代碼書寫的順序與實現執行的順序不同,指令重排序是編譯器或處理...
時間:2017年07月09日星期日說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:無學習源碼:https://github.com/zccodere/s... 第一章:課程簡介 1-1 課程簡介 課程目標和學習內容 共享變量在線程間的可見性 synchronized實現可見性 volatile實現可見性 指令重排序 as-if-seria...
摘要:本文會先闡述在并發編程中解決的問題多線程可見性,然后再詳細講解原則本身。所以與內存之間的高速緩存就是導致線程可見性問題的一個原因。原則上面討論了中多線程共享變量的可見性問題及產生這種問題的原因。 Happens-Before是一個非常抽象的概念,然而它又是學習Java并發編程不可跨域的部分。本文會先闡述Happens-Before在并發編程中解決的問題——多線程可見性,然后再詳細講解H...
摘要:貓說多線程之內存可見性下篇歡迎你留言討論屬于你的見解,畢竟每個人的味蕾都不一樣,這杯咖啡有吸引到你嗎好像又是一個槽糕的比喻本文已轉載個人技術公眾號歡迎留言討論與點贊上一篇推薦貓說主數據類型和引用下一篇推薦貓說多線程之內存可見性下篇 閱讀本文約3分鐘 本文大致講述兩種線程實現的可見性,或許你已經提前想到了,那說明你的基礎很好,我們要聊聊synchronized實現可見性與volatil...
摘要:多線程主要就是圍繞可見性和原子性這兩個特性展開的,關鍵字對應著可見性,但很多時候人們誤以為使用了關鍵字后編寫多線程就沒問題了,不知道它不能保證原子性。 說起volatile和sychronized這兩個關鍵字,學習過多線程的同學應該都很熟悉,在jdk1.5之前,主要就是靠這兩個關鍵字來做多線程編程的,但在jdk1.5以后,多了一個java.util.concurrent(JUC)包,里...
閱讀 2024·2019-08-30 15:52
閱讀 2984·2019-08-29 16:09
閱讀 1329·2019-08-28 18:30
閱讀 2459·2019-08-26 12:24
閱讀 1102·2019-08-26 12:12
閱讀 2278·2019-08-26 10:45
閱讀 575·2019-08-23 17:52
閱讀 833·2019-08-23 16:03