java多線程的理解


線程的5種狀態:新建,就緒,運行,阻塞,死亡。

Thread.sleep:線程  運行狀態 轉為  阻塞狀態。

Thread.yield:   線程 運行狀態 轉為 就緒狀態。

ThreadA.join:等待ThreadA執行完成。

 

線程的兩種方式:

繼承自Thread,實現Runnable.

在線程中看是否有操作的同一對象的實例。如果有的話要考慮線程的同步和互斥。通俗點來說就是某個類的某個成員變量會有多個線程訪問。

線程的同步

同步代碼塊:同步加鎖的是對象,而不是代碼。

synchronized(Object A){

}

同步監視器是A,表示的是一個臨界區。

 

同步方法:

synchronized Method1(){

}

 

synchronized Method2(){

}

同步鎖:

Lock lock = new ReentrantLock();

public Mehtod1(){

lock.lock();

finally{

     lock.unlock();

}

}

 

public Mehtod2(){

lock.lock();

finally{

     lock.unlock();

}

}

同步監視器的釋放:

1.當前線程的同步方法或者同步代碼塊執行結束,當前線程即釋放同步監視器。

2.在同步方法或者同步代碼塊中出現了error或者exception的時候。

3.當線程執行同步方法或者同步代碼塊時,程序執行了同步監視器對象的wait方法,則當前線程,並釋放同步監視器。

下面的情況不會釋放同步監視器:

1.當線程執行同步方法或者同步代碼塊時,程序調用Thread.Sleep,Thread.Yield方法。

2.當線程執行同步方法或者同步代碼塊時,其他線程調用了該線程的suspend方法將該線程掛起。

線程的通信:

同步方法塊或者同步方法使用object的wait,notify和notifyAll三個方法來進行線程的通信。

如果是同步方法塊synchronized(Object a):則在代碼中要使用a.wait,a.notify,a.notifyAll;

如果使用的是同步方法synchronized methodA(),則同步監視器是this對象,可以直接在代碼中使用wait,notify和notifyAll方法。

wait:導致當前的線程等待,並且釋放當前的同步監視器。直到其他線程調用該同步監視器的notify方法和notifyall方法。

notify:喚醒在此監視器上等待的單個線程,但是選擇是任意的。

notifyAll:喚醒在同步監視器上等待的所有線程。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM