同步代碼塊的鎖是自己定義的對象,每個Object對象都有一個標誌位(屬性),默認爲1。當線程執行同步代碼塊的時候,首先檢查鎖對象的標誌位,如果爲1則執行並且將該標誌位置爲0。如果爲0則發生阻塞,等待正在執行的線程執行完畢自動將將鎖置爲1,接下來才能繼續執行。
注意:多個對象共享的鎖是相同的,所以鎖對象的創建代碼不能放在run方法中。
同步方法的鎖是當前調用該方法的對象,也就是this指向的對象。也就是實現Runnable接口的類的對象。這也就是所以爲了實現共同訪問一個資源要用Runnable接口去實現而非繼承Thread類。
同步靜態方法的鎖是該方法所在類的Class對象,該對象可以用類名.class的方式獲取。這個對象和該類的對象的getClass()的返回值是一樣的。這個對象在加載類的時候由虛擬機自動創建。