1. 程式人生 > >JAVA鎖原理和選擇synchronized & Lock

JAVA鎖原理和選擇synchronized & Lock

廢話不多說,進正題,參考一下synchronized 的實現原理

synchronized 的實現原理

JVM可以從方法常量池中的方法表結構(method_info Structure) 中的 ACC_SYNCHRONIZED 訪問標誌區分一個方法是否同步方法。當方法呼叫時,呼叫指令將會 檢查方法的 ACC_SYNCHRONIZED 訪問標誌是否被設定,如果設定了,執行執行緒將先持有monitor(虛擬機器規範中用的是管程一詞), 然後再執行方法,最後再方法完成(無論是正常完成還是非正常完成)時釋放monitor。在方法執行期間,執行執行緒持有了monitor,其他任何執行緒都無法再獲得同一個monitor。如果一個同步方法執行期間拋 出了異常,並且在方法內部無法處理此異常,那這個同步方法所持有的monitor將在異常拋到同步方法之外時自動釋放。
說白了就是狀態鎖,JVM分配一個記憶體儲存狀態,此狀態標識該方法是不是被synchronized 修飾,如果是那麼執行這個方法的時候monitor+1,然後監視monitor,如果monitor!=-1 那麼其他執行緒等待,方法執行完(正常或異常)JVM都會主動釋放鎖monitor-1,不需要我們瞎操心,LOCK和synchronized 的區別在此,LOCK需要我們手動釋放鎖,JVM的親兒子是synchronized ,所以還是好好用synchronized 吧,不要跟JVM過不去。

好,看了上面的東西,如果自己實現鎖的話,要怎麼辦呢,關注2點

  1. 狀態----該資源是否被佔用
  2. 釋放鎖—包括正常和異常情況

好,那我就靠這個做一個分散式鎖試試,下篇講解