用關鍵字synchronized宣告方法在某些情況下是有弊端的,比如a執行緒呼叫同步方法執行乙個長時間的任務,那麼b執行緒則必須等待較長時間。可以使用synchronized同步語句塊。
public
class nosysntest
system.out.println("sleep end threadname="+thread.currentthread().getname()+" time="+system.currenttimemillis());
}catch (interruptedexception e)
}}
當乙個執行緒訪問object的乙個synchronized同步**塊時,另乙個執行緒仍然可以訪問該object物件中的非synchronized同步**塊。
二、一半非同步,一半同步
不在synchronized塊中就是非同步執行,在synchronized塊中就是同步執行。
public
class nosysntest
synchronized (this)
}system.out.println("sleep end threadname="+thread.currentthread().getname()+" time="+system.currenttimemillis());
}}結果:
非同步 threadnameb i=20
非同步 threadnameb i=21
非同步 threadnamea i=0
非同步 threadnamea i=1
。。。非同步 threadnameb i=98
非同步 threadnameb i=99
同步 threadnameb i=0
同步 threadnameb i=1
同步 threadnameb i=2
同步 threadnameb i=3
。。。
三、synchronized**塊間的同步性
當乙個執行緒訪問object的乙個synchronized同步**塊時,其他執行緒對同乙個object中所有其他的synchronized同步**塊(可以是不同的方法中的)的訪問將被阻塞。
public
class nosysntest
}public
void
service()
}}
多執行緒呼叫同乙個物件中的不同名稱的synchronized**同步方法或synchronized(this)同步**塊時,呼叫的效果是按順序執行,也就是同步的**,阻塞的。
四、將任意物件作為物件監視器
這個「任意物件」大多數是例項變數及方法的引數,使用格式是synchronized(非this物件)
它的規則是:
4.1、在多個執行緒持有「物件監視器」為同乙個物件(相同的例項變數 或者 方法引數 )的前提下,同一時間只有乙個執行緒可以執行synchronized(非this物件)同步**塊中的**。
public
class nosysntest
}}//針對乙個nosysntest 例項物件,它的**例項變數anystr**對於執行緒a 和執行緒b來說都是一樣的,因此只有乙個執行緒可以呼叫該**塊。
//但是如果**把 anystr 物件例項 放在方法裡**。那就是不同的物件,那就是非同步了(不是同乙個鎖)。
4.2、當持有」物件監視器」為同乙個物件的前提下,同一時間只有乙個執行緒可以執行synchronized(非this物件)同步**塊中的**
鎖非this物件的優點:
如果在乙個類中有很多個synchronized方法,雖然能實現同步,但是會受到阻塞,所以影響執行效率;如果使用同步**塊非this物件,則synchronized(非this)**塊中的程式與同步方法是非同步的,不與其他鎖this同步方法爭搶this鎖,可以提高效率。
//由於物件監視器不同,所以執行結果是非同步的
public
class nosysntest
}//同步方法
synchronized public
void
service()
}
三個結論:
1、當多個執行緒同時執行synchronized(非this物件 x)同步**塊時呈同步效果(監視器物件是一樣的)。
public
class nosysntest
}}
2、當其他執行緒執行x物件(也就是監控器物件)中synchronized同步方法時呈同步效果。
//監控器物件
public
class hasselfprivatenum
}public
class nosysntest
}}結果:執行緒a 和 執行緒b 是同步的
3、當其他執行緒執行x物件(也就是監控器物件)中synchronized(this)**塊時也呈同步效果。 執行緒同步synchronized
synchronized只是保證在同乙個時刻,其他執行緒不能訪問鎖定的資源,但是其他方法或者是變數不能鎖定控制的 synchronized obj 上面語法格式中synchronized後括號裡的obj就是同步監視器,上面 的含義是 執行緒開始執行同步 塊之前,必須先獲得對同步監視器的鎖定。任何時刻...
synchronized同步方法
關鍵字synchronized 如果是在方法內的變數,則無所謂的的變數同步問題。因為在方法內部的變數都是私有的。synchronized如果是加在方法上面,則是對該物件的例項進行同步。如果有兩個執行緒同時對該方法進行操作,則會同步進行。對個例項多個執行緒,不存在同步的問題,那時jvm會生成多個鎖,應...
Synchronized同步方法
非執行緒安全 其實會在多個執行緒對同乙個物件中的例項變數進行併發訪問時發生,產生的後果就是 髒讀 也就是取到的資料其實是被更改過的。1 方法內的變數為執行緒安全的 方法內部的私有變數,則不存在 非執行緒安全 的問題,所得結果也就是 執行緒安全 的。2 例項變數非執行緒安全 如果多個執行緒共同訪問乙個...