我們在編寫程式時,總會看到每個物件都有幾個相同的方法,比如說wait()、notify()等,其實它們都是從object類繼承下來的,用於實現執行緒同步用的,當然這是jdk1.5之前的方法,jdk1.5之後提供了並發包一系列類用於支援多執行緒互斥與同步問題。
注意這三個方法都必須在相應物件的synchronized**塊中被呼叫,也就是說只有在獲得乙個物件的鎖後才能呼叫這個物件的這三個方法,否則會報illegalmonitorstateexception。
public class producerconsumerobject
public producerconsumerobject(int bufsize) throws illegalargumentexception
buf = new int[bufsize];
}public void put(int v) throws interruptedexception
buf[currentsize++] = v;
obj.notify();
break;}}
public int get() throws interruptedexception
int temp = buf[currentsize-1];
buf[currentsize--] = 0;
obj.notifyall();
return temp;}}
@override
public string tostring()
if(currentsize > 0)
return sb.tostring();}}
1.put方法和get方法都是阻塞方法,也就是說在put的時候假如佇列已滿,那麼會一直等待直到佇列不滿才返回,在get的時候假如隊列為空,那麼會一直等待直到佇列不為空才返回。
2.專門new乙個私有object物件obj作為鎖,這是因為我們不希望這裡使用到的鎖在其它地方被使用以讓程式不能正常工作。
3.最好總是把wait放在迴圈中,因為如果正在wait可能因為某種奇怪的原因被「假喚醒」,或者被喚醒後所需條件由被馬上由符合改為不符合了,這都可能會造成程式崩潰。
4.盡量呼叫notifyall而不是notify,特別是在多生產者-多消費者這模型下,否則可能會導致死鎖。
5.notify(或者notifyall)後需要等到當前執行緒退出synchronized同步塊wait執行緒才有可能搶到鎖。
JAVA 執行緒同步機制
執行緒安全問題 當多個執行緒共享一批資料時,則會出現執行緒安全問題,看個demo 三個執行緒 同時賣100張票,此時執行則會出現執行緒安全問題,執行結果可能會出現賣重複的張數,或者賣不出現的張數。public class runnable2 implements runnable catch int...
Java同步機制的應用
基本概念 每個object都會有1個鎖.同步就是序列使用一些資源.說明 以下有些例子為了突出重點,省略了不必要的 特別是省掉了一些成員變數,就是需要同步的物件.1.多執行緒中對共享 可變的資料進行同步.對於函式中的區域性變數沒必要進行同步.對於不可變資料,也沒必要進行同步.多執行緒中訪問共享可變資料...
理解同步與非同步,及java中實現同步機制的方法
執行緒間的同步訪問 執行緒同步機制是解決多執行緒訪問共享資源時導致的記憶體不一致問題。一般說到的hashmap是非同步的,hashtable是同步的,是說hashmap是執行緒不安全的,hashtable是執行緒安全的。執行緒同步訪問的方法 1.加鎖 2.volatile 3.threadlocal...