多執行緒五:synchronized同步程式碼塊
阿新 • • 發佈:2019-02-16
使用synchronized的弊端
A執行緒呼叫同步方法執行一個長時間的任務,那麼B執行緒則必須等待比較長時間。
synchronized同步程式碼塊
兩個併發執行緒訪問同一個物件object中synchronized(this)同步程式碼塊時,一段時間內只能有一個執行緒被執行,另一個執行緒必須等待當前執行緒執行完這個程式碼以後才能執行該程式碼塊。
當一個執行緒訪問object的一個synchronized同步程式碼塊時,另一個執行緒仍然可以訪問該object物件中的非synchronized(this)同步程式碼塊。
一半非同步,一半同步:不在synchronized塊中就是非同步執行,在synchronized
Synchronized程式碼塊間的同步性:當一個執行緒訪問object的一個synchronized(this)同步程式碼塊時,其他執行緒對同一個object中所有其他synchronized(this)同步程式碼塊的訪問將被阻塞,這說明synchronized使用“物件監視器”是一個。
可以將任意物件作為物件監視器:鎖非this物件具有一定的優點,如果在一個類中有很多個synchronized方法,這是雖然同步,但會受到阻塞,所以影響執行效率;如果使用同步程式碼塊鎖非this物件,則synchronized(非this)程式碼塊中的程式與同步方法是非同步的,不與其它鎖this同步方法爭搶
靜態同步synchronized方法與synchronized(class)程式碼塊
synchronized關鍵字加到static靜態方法上是給Class類上鎖,而synchronized關鍵字加到非static靜態方法上是給物件上鎖。物件鎖僅對當前物件有用,而class鎖可以對類的所有物件例項起作用。