volatile 揮發性
1,保證可見性
2,禁止指令重排序(一定程度保證有序性)
3,並不能保證原子性
(lock字首指令--》記憶體屏障(記憶體柵欄))
具體使用條件:
1)對變數的寫操作不依賴於當前值
2)該變數沒有包含在具有其他變數的不變式中
某些情況效能優於synchronized 但是不能替代之。
使程式不因為機器的編譯優化而忽略或者省略某些語句
intel mesi 協議 ————》保證每個快取中使用的共享變數都是一致的
當cpu寫資料的時候,如果發現操作的變數是共享變數,即在其他cpu中也存在該變數的副本,會通知其他cpu將該變數的快取行 置為無效狀態
其他cpu需要從記憶體中重新讀取
instruction reorder指令重排序
處理器為了提高執行效率,可能會對輸入**進行優化,不保證**順序執行,但是保證**執行的結果為**順序執行的結果。
(如果**之間沒有資料依賴性,就可能發生指令重排序)
併發程式正確的執行,必須保證原子性(乙個操作或者多個操作 要麼全部執行並且執行的過程不會被任何因素打斷,要麼就都不執行。),
、 可見性(當多個執行緒訪問同乙個變數時,乙個執行緒修改了這個變數的值,其他執行緒能夠立即看得到修改的值。),
有序性(程式執行的順序按照**的先後順序執行。)。
程式次序
lock鎖
volatile 先寫後讀
傳遞 a b, b c 所以 a c
執行緒(啟動 中斷 終結)
物件 終結
1, 程式次序規則:乙個執行緒內,按照**順序,書寫在前面的操作先行發生於書寫在後面的操作
2, 鎖定規則:乙個unlock操作先行發生於後面對同乙個鎖額lock操作
3,volatile變數規則:對乙個變數的寫操作先行發生於後面對這個變數的讀操作
4,傳遞規則:如果操作a先行發生於操作b,而操作b又先行發生於操作c,則可以得出操作a先行發生於操作c
5, 執行緒啟動規則:thread物件的start()方法先行發生於此執行緒的每個乙個動作
6 執行緒中斷規則:對執行緒interrupt()方法的呼叫先行發生於被中斷執行緒的**檢測到中斷事件的發生
7 執行緒終結規則:執行緒中所有的操作都先行發生於執行緒的終止檢測,我們可以通過thread.join()方法結束、thread.isalive()的返回值手段檢測到執行緒已經終止執行
8 物件終結規則:乙個物件的初始化完成先行發生於他的finalize()方法的開始
Java併發系列五 深入理解volatile關鍵字
instance new instancce instance是volatile變數 這個寫回記憶體的操作會使得其他cpu裡快取了該記憶體位址的資料無效 乙個處理器的快取回寫到記憶體會導致其他處理器的快取失效 當處理器發現本地快取失效後,就會從記憶體中重讀該變數資料,即可以獲取當前最新值。publi...
css 縱向合併 CSS 知識總結
主要重點 border除錯法 不管寫什麼樣式 一定要寫border 1.文件流 即文件中元素流動的方向,大致分為一下三種inline block,inline,block,其中又分為三種 流動方向,高度,寬度流動方向inline 元素從左到右,直到最右邊才換行 block 元素從上到下,嗎,每乙個都...
Java知識學習
讀取檔案裡面的內容,直接讀取不就得了,但是我看到很多人都要乙個位元組陣列,例如 byte b new byte 1024 然後再讀取 b裡面的內容,像下面這樣 fileinputstream in new fileinputstream e lyrics.txt byte b new byte 10...