1.object.wait()
使用方法:
線(xiàn)程A:
synchronized(obj){
obj.wait(); //此時(shí)當(dāng)前線(xiàn)程釋放obj鎖漆枚,進(jìn)入[等待狀態(tài)]屠列,等待其他線(xiàn)程執(zhí)行obj.notify()時(shí)才有可能執(zhí)行(有可能執(zhí)行的意思可能有多個(gè)線(xiàn)程執(zhí)行了wait)
A do something
}
線(xiàn)程C:
synchronized(obj){
obj.wait(); //此時(shí)當(dāng)前線(xiàn)程釋放obj鎖,進(jìn)入[等待狀態(tài)]蹂随,等待其他線(xiàn)程執(zhí)行obj.notify()時(shí)才有可能執(zhí)行(有可能執(zhí)行的意思可能有多個(gè)線(xiàn)程執(zhí)行了wait)
C do something
}
線(xiàn)程B:
synchronized(obj){
obj.notify(); //此時(shí)當(dāng)前線(xiàn)程釋放obj鎖锹漱,隨機(jī)喚醒一個(gè)處于等待狀態(tài)的線(xiàn)程佩谷,繼續(xù)執(zhí)行wait后面的程序腋逆。
}
假設(shè)三個(gè)線(xiàn)程執(zhí)行順序
線(xiàn)程A-->線(xiàn)程C-->線(xiàn)程B //沒(méi)毛病婿牍,因?yàn)閣ait后是釋放了鎖的
所以問(wèn)題來(lái)了:等待的線(xiàn)程中有A和C, B notify后,只會(huì)喚醒其中一個(gè)執(zhí)行(notifyAll同樣只有一個(gè)執(zhí)行)惩歉;假如我們的需求是想讓A線(xiàn)程執(zhí)行等脂,那么這種object的方式是無(wú)法控制的
2.所以condition來(lái)了
使用方法:注意condition是依賴(lài)ReentrantLock
ReentrantLock lock = new ReentrantLock(true);
Condition aCondition = reentrantLock.newCondition();
Condition cCondition = reentrantLock.newCondition();
線(xiàn)程A:
{
lock.lock();
aCondition.await(); //此時(shí)當(dāng)前線(xiàn)程釋放lock鎖,進(jìn)入[等待狀態(tài)]撑蚌,等待其他線(xiàn)程執(zhí)行aCondition.signal()時(shí)才有可能執(zhí)行
A do something
lock.unlock();
}
線(xiàn)程C:
{
lock.lock();
cCondition.await();
do something
lock.unlock();
}
線(xiàn)程B:
{
lock.lock();
aCondition.signal(); //此時(shí)當(dāng)前線(xiàn)程釋放lock鎖上遥,隨機(jī)喚醒一個(gè)處于等待狀態(tài)等待aCondition的線(xiàn)程,繼續(xù)執(zhí)行await后面的程序争涌。
//cCondition.signal(); ////此時(shí)當(dāng)前線(xiàn)程釋放lock鎖粉楚,隨機(jī)喚醒一個(gè)處于等待狀態(tài)等待cCondition的線(xiàn)程,繼續(xù)執(zhí)行await后面的程序亮垫。
lock.unlock();
}
所以通過(guò)condition與object進(jìn)行線(xiàn)程通信的區(qū)別已經(jīng)很明顯了解幼,condition更加靈活。
個(gè)人理解包警,本質(zhì)上來(lái)講:
多線(xiàn)程環(huán)境的下,線(xiàn)程直接的互斥[執(zhí)行]依靠的應(yīng)該是鎖Lock底靠,線(xiàn)程的之間的[通信]依靠的應(yīng)該是條件Condition/信號(hào)害晦,一般情況下lock確實(shí)可以同時(shí)滿(mǎn)足做這兩個(gè)事情,所以在Object的方式滿(mǎn)足了這個(gè)一般情況,但是肯定會(huì)有復(fù)雜的場(chǎng)景比如剛才例子中壹瘟,需要讓滿(mǎn)足一定條件的線(xiàn)程執(zhí)行鲫剿,僅僅依靠鎖是不能完美解決的。所以condition實(shí)際上分離了執(zhí)行和通信稻轨。
以上僅是condition與object在應(yīng)用層面的上的區(qū)別灵莲,而背后的實(shí)現(xiàn)原理也是大有不同,以后再追加殴俱。