萬能的synchronized

synchronized的萬能(原子,可見,有序)

原子性

  • 若是一個變量事先未被Lock鎖定,那麼不容許對其unlock操做,也不能unlock一個被其餘線程鎖定的變量。

synchronized隱式使用lock和unlock,保證了lock和unlock操做之間的代碼是原子的。多線程

可見性

1.synchronized的內存語義

八大happens-before規則中的兩條:app

  • 對一個變量執行lock操做,必須清空工做內存中此變量的值,在執行引擎使用該變量以前,從新執行load或assign。
  • 對一個變量unlock操做以前,必須把此變量同步會主內存。
    也就是說,
  • 當一個線程獲取一個鎖,這個線程從新從主內存加載最新的數據到本地內存;
  • 當一個線程釋放一個鎖的時候,將該線程本地內存中的最新最正確的數據同步到主內存。

二者結合,能夠看出鎖的釋放,獲取的內存語義能夠類比volatile變量的讀/寫的內存語義,鎖的釋放至關於volatile的寫,鎖的獲取至關於volatile的寫。因此鎖具有內存可見性。線程

2.如何實現這樣的內存語義

在JVM規範中能夠看到JVM中synchronized的實現原理,JVM基於進入和退出Monitor來實現方法同步和代碼同步,實現細節不同,代碼同步使用monitorenter,monitorexit兩個指令實現,編譯器會在同步代碼開始處插入monitorenter指令,在結束處或者異常處插入monitorexit指令,==這兩個字節碼指令隱式使用lock和unlock操做==。內存

有序性

  • 同一時間只有一個線程能夠對一個變量進行lock操做,像是把多線程的環境變爲了單線程,自然具有有序性(程序順序規則)
相關文章
相關標籤/搜索