簡單記錄下java中synchronized關鍵字的使用方法。
在介紹之前需要明確下java中的每一個類的對象實例都有且只有一個鎖(lock)和之相關聯,synchronized關鍵字只作用于該鎖,即可以認為synchronized只對java類的對象實例起作用。
synchronized修飾函數
1、synchronized鎖定的是調用這個同步方法的對象實例,舉個例子,同一個實例P1在不同線程中都調用aMethod時會產生同步;
2、需要注意的是這個對象所屬的類的另一對象P2卻能夠任意調用這個aMethod,因為不同的對象實例的synchronized方法是不相干擾的。也就是說,其它線程照樣可以同時訪問相同類的另一個對象實例中的aMethod方法;
3、如果一個對象有多個synchronized方法,比如aMethod、bMethod、cMethod,現在只要一個線程訪問了其中的一個synchronized方法,其它線程不能同時訪問這個對象中任何一個synchronized方法。
上述代碼其實等價于下面:
synchronized修飾代碼塊
synchronized修飾靜態方法
前面提到了synchronized關鍵字只對不同線程中的P1實例有效,那如何可以同時對P1和P2不同實例有效呢,答案就是使用synchronized修飾靜態方法,類的靜態方法可以說是這個類自有的,并不依賴類的實例,所以我們只要對類的靜態方法使用synchronized關鍵字來修飾就可以達到不同實例間的同步了。
新聞熱點
疑難解答