天天看點

同步方法和同步塊

由于我們可以通過private關鍵字來保證資料對象隻能被方法通路,是以我們隻需要針對方法提出一套機制,這套機制就是synchronized關鍵字,它包括兩種用法:synchronized方法和synchronized塊

同步方法:public synchronized void method(int args){}

synchronized方法控制對“對象”的通路,每個對象對應一把鎖,每個synchronized方法都必須獲得調用該方法的對象的鎖才能執行,否則線程會阻塞,方法一旦執行,就獨占該鎖,直到該方法傳回才釋放鎖,後面被阻塞的線程才能獲得這個鎖,繼續執行

缺陷:若将一個大的方法申明為synchronized将會影響效率

隻讀方法和修改方法:

方法裡面需要修改的内容才需要鎖,鎖的太多,浪費資源

同步塊:synchronized(obj){}

obj稱之為同步螢幕

obj可以是任何對象,但是推薦使用共享資源作為同步螢幕(鎖變化的量)

同步方法中無需指定同步螢幕,因為同步方法的同步螢幕就是this,就是這個對象本身,或者是class[詳情見反射]

同步螢幕的執行過程

第一個線程通路,鎖定同步螢幕,執行其中代碼

第二個線程通路,發現同步螢幕被鎖定,無法通路

第一個線程通路完畢,解鎖同步螢幕

第二個線程通路,發現同步螢幕沒有鎖,然後鎖定并通路

繼續閱讀