360 上線“番茄快搜”App,主打極簡搜尋
阿新 • • 發佈:2021-06-30
1.volatile是什麼?
volatile是java虛擬機器提供的輕量級的同步機制,具有如下特性:
a.保證可見性
b.不保證原子性
c.禁止指令重排
2.JMM記憶體模型?
JMM——https://www.cnblogs.com/zhouxuezheng/p/14950302.html
3.volatile的可見性程式碼驗證:
主執行緒中判斷資源類Cache中的變數a的值是否為0,如果為0則一直死迴圈。新開的執行緒A會在2秒鐘後去改變Cache中a的值,但是主執行緒不能及時獲取到a的最新值從而一直死迴圈,程式並不會在2秒鐘結束。即執行緒A中對Cache中a的修改對main執行緒而言不可見 。如果在變數a上新增volatile關鍵字,程式就可在2秒後就可正常退出。注意:如果在while程式碼塊中有System.out.println();程式也會在2秒後正常退出,這是因為System.out.println()方法底層有synchronized關鍵字,這會導致main執行緒強制獲取主存中的資料。
class Cache{ int a = 0; public void setA() { a = 2; } } public class VolatileDemo { public static void main(String[] args) { Cache cache = new Cache(); new Thread(() -> { try { Thread.sleep(2000); } catch (InterruptedException e) {} cache.setA(); },"執行緒A").start(); while (cache.a == 0) { } } }