教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢/投訴熱線:400-618-4000

Java培訓(xùn)之java難點(diǎn)解析(十五)-Lock接口

更新時(shí)間:2016年03月17日14時(shí)48分 來(lái)源:傳智播客Java培訓(xùn)學(xué)院 瀏覽次數(shù):

Lock接口:多線程在JDK1.5版本升級(jí)時(shí),推出一個(gè)接口Lock接口。
解決線程安全問(wèn)題使用同步的形式,(同步代碼塊,要么同步函數(shù))其實(shí)最終使用的都是鎖機(jī)制。
 
到了后期版本,直接將鎖封裝成了對(duì)象。線程進(jìn)入同步就是具備了鎖,執(zhí)行完,離開(kāi)同步,就是釋放了鎖。
在后期對(duì)鎖的分析過(guò)程中,發(fā)現(xiàn),獲取鎖,或者釋放鎖的動(dòng)作應(yīng)該是鎖這個(gè)事物更清楚。所以將這些動(dòng)作定義在了鎖當(dāng)中,并把鎖定義成對(duì)象。
 
所以同步是隱示的鎖操作,而Lock對(duì)象是顯示的鎖操作,它的出現(xiàn)就替代了同步。
 
在之前的版本中使用Object類(lèi)中wait、notify、notifyAll的方式來(lái)完成的。那是因?yàn)橥街械逆i是任意對(duì)象,所以操作鎖的等待喚醒的方法都定義在Object類(lèi)中。
 
而現(xiàn)在鎖是指定對(duì)象Lock。所以查找等待喚醒機(jī)制方式需要通過(guò)Lock接口來(lái)完成。而Lock接口中并沒(méi)有直接操作等待喚醒的方法,而是將這些方式又單獨(dú)封裝到了一個(gè)對(duì)象中。這個(gè)對(duì)象就是Condition,將Object中的三個(gè)方法進(jìn)行單獨(dú)的封裝。并提供了功能一致的方法 await()、signal()、signalAll()體現(xiàn)新版本對(duì)象的好處。
< java.util.concurrent.locks > Condition接口:await()、signal()、signalAll();
--------------------------------------------------------
class BoundedBuffer {
   final Lock lock = new ReentrantLock();
   final Condition notFull  = lock.newCondition(); 
   final Condition notEmpty = lock.newCondition(); 
   final Object[] items = new Object[100];
   int putptr, takeptr, count;
   public void put(Object x) throws InterruptedException {
     lock.lock();
     try {
       while (count == items.length) 
         notFull.await();
       items[putptr] = x; 
       if (++putptr == items.length) putptr = 0;
       ++count;
       notEmpty.signal();
     } 
finally {
       lock.unlock();
     }
   }
   public Object take() throws InterruptedException {
     lock.lock();
     try {
       while (count == 0) 
         notEmpty.await();
       Object x = items[takeptr]; 
       if (++takeptr == items.length) takeptr = 0;
       --count;
       notFull.signal();
       return x;
     } 
finally {
       lock.unlock();
     }
   } 
 }


本文版權(quán)歸傳智播客Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:傳智播客Java培訓(xùn)學(xué)院
首發(fā):http://m.8y3kgpwe.cn/javaee 
0 分享到:
和我們?cè)诰€交談!