1. 程式人生 > >多執行緒五:synchronized同步程式碼塊

多執行緒五:synchronized同步程式碼塊

使用synchronized的弊端

A執行緒呼叫同步方法執行一個長時間的任務,那麼B執行緒則必須等待比較長時間。

synchronized同步程式碼塊

兩個併發執行緒訪問同一個物件objectsynchronized(this)同步程式碼塊時,一段時間內只能有一個執行緒被執行,另一個執行緒必須等待當前執行緒執行完這個程式碼以後才能執行該程式碼塊。

當一個執行緒訪問object的一個synchronized同步程式碼塊時,另一個執行緒仍然可以訪問該object物件中的非synchronized(this)同步程式碼塊。

一半非同步,一半同步:不在synchronized塊中就是非同步執行,在synchronized

塊中就是同步執行。

Synchronized程式碼塊間的同步性:當一個執行緒訪問object的一個synchronized(this)同步程式碼塊時,其他執行緒對同一個object中所有其他synchronized(this)同步程式碼塊的訪問將被阻塞,這說明synchronized使用“物件監視器”是一個。

可以將任意物件作為物件監視器:鎖非this物件具有一定的優點,如果在一個類中有很多個synchronized方法,這是雖然同步,但會受到阻塞,所以影響執行效率;如果使用同步程式碼塊鎖非this物件,則synchronized(this)程式碼塊中的程式與同步方法是非同步的,不與其它鎖this同步方法爭搶

this鎖,則可大大提高執行效率。  缺點:由於物件監視器的不同,所以執行結果是非同步的,這這樣並不能保證呼叫方法的執行緒的執行同步/順序性,也就是呼叫方法的順序是無序的,雖然在同步塊中執行的順序是同步的,這樣極易出現“髒讀”問題。


靜態同步synchronized方法與synchronized(class)程式碼塊

synchronized關鍵字加到static靜態方法上是給Class類上鎖,而synchronized關鍵字加到非static靜態方法上是給物件上鎖。物件鎖僅對當前物件有用,而class鎖可以對類的所有物件例項起作用。