公平鎖VS非公平鎖
公平鎖(Fair):加鎖前檢查是否有排隊等待的線程,優先排隊等待的線程,先來先得,例如每個線程搶占鎖的順序為先后調用lock方法的順序依次獲取鎖,類似于排隊吃飯。非公平鎖(Nonfair):加鎖時不考慮排隊等待問題,直接嘗試獲取鎖,獲取不到自動到隊尾等待,例如每個線程搶占鎖的順序不定,誰運氣好,誰就獲取到鎖,和調用lock方法的先后順序無關,類似于堵車時,加塞的那些XXXX。
synchronized就是非公平鎖,它無法保證等待的線程獲取鎖的順序; ReentrantLock 默認的lock()方法采用的是非公平鎖,但可以選擇公平鎖實現的方式。 public ReentrantLock(boolean fair) //根據參數初始化為公平鎖或者非公平鎖 { sync = fair ? new FairSync() : new NonfairSync(); }
Volatile
通過java內存模型(JMM)保證volatile的可見性和有序性。編譯器和處理器不會對存在數據依賴關系的操作做重排序,因為這種重排序會改變執行結果。而線程與線程之間使用的是共享變量的副本,副本沒有依賴關系導致線程間可能出現重排序的問題。JMM通過java進程之間的通信,控制主內存與每個線程的本地內存之間的交互,來為java程序員提供內存可見性保證。Volatile通過內存屏障保證寫的數據即時刷新到主內存,來防止線程間的重排序問題,Volatile內存屏障的實現請點擊這里!
新聞熱點
疑難解答