synchronized關鍵字用來實如今併發編程中線程間的同步,synchronized相對於volatile關鍵字實現的是基於對象鎖的同步,在java中每一個對象均可以同步的鎖。synchronized支持有實例方法、靜態方法、實例方法中的同步塊、靜態方法中的同步塊。html
參考資料:java
聊聊併發(二)Java SE1.6中的Synchronized編程
- 對於同步方法,鎖是當前實例對象。
- 對於靜態同步方法,鎖是當前對象的Class對象。
- 對於同步方法塊,鎖是Synchonized括號裏配置的對象。
4 同步的原理併發
JVM規範規定JVM基於進入和退出Monitor對象來實現方法同步和代碼塊同步,但二者的實現細節不同。代碼塊同步是使用monitorenter和monitorexit指令實現,而方法同步是使用另一種方式實現的,細節在JVM規範裏並無詳細說明,可是方法的同步一樣能夠使用這兩個指令來實現。monitorenter指令是在編譯後插入到同步代碼塊的開始位置,而monitorexit是插入到方法結束處和異常處, JVM要保證每一個monitorenter必須有對應的monitorexit與之配對。任何對象都有一個 monitor 與之關聯,當且一個monitor 被持有後,它將處於鎖定狀態。線程執行到 monitorenter 指令時,將會嘗試獲取對象所對應的 monitor 的全部權,即嘗試得到對象的鎖。oracle
Eliminating SynchronizationRelated Atomic Operations with Biased Locking and Bulk Rebiasingoop
(注:32bitJVM)線程
http://www.cnblogs.com/paddix/p/5367116.htmlhtm