問題:
java線程同步實現的方法有哪幾種
分析:
java實現同步主要使用synchronized關鍵字,同時伴隨使用的有wait().sleep().notify().Allnotify()方法
解答:
java同步方式有兩種:同步方法和同步塊。
1.同步方法
給一個方法增加synchronized關鍵字就可以使它成爲同步方法,方法可以是靜態方法和非靜態方法。但是不能是尚未實現的方法(抽象方法與接口方法)。
eg1.
public synchronized void aMethod(){ //do someting } public static synchronized void anotherMethod(){ //do someting }
2.同步塊
同步塊將同步保護範圍縮小。這樣可以不用對整個方法進行保護,只需要將一個塊作爲臨界區進行保護
eg2.
public void run(){
synchronized(this){
//do something.
}
}
原理:synchronized的目的是使同一個對象的多個線程進行同步。
每個對象都有一個“鎖標誌”。當這個對象的一個線程訪問某個synchronized的數據時,所有的synchronized數據都會上鎖。因爲“鎖標誌”被當前線程帶走。
如果對靜態方法(包含靜態塊),網上有篇文章是這樣解釋的“那麼線程鎖定的就不是這個類的對象了,也不是這個類自身,而是這個類對應的java.lang.Class類型的對象。同步方法和同步塊之間的相互制約只限於同一個對象之間,所以靜態同步方法只受它所屬類的其它靜態同步方法的制約,而跟這個類的實例(對象)沒有關係。”這裏其實就是指的類對象(用於實例化其他對象)。