Lock接口

Lock接口:多線程在JDK1.5版本升級時,推出一個接口Lock接口。java

解決線程安全問題使用同步的形式,(同步代碼塊,要麼同步函數)其實最終使用的都是鎖機制。安全

 

到了後期版本,直接將鎖封裝成了對象。線程進入同步就是具有了鎖,執行完,離開同步,就是釋放了鎖。多線程

在後期對鎖的分析過程當中,發現,獲取鎖,或者釋放鎖的動做應該是鎖這個事物更清楚。因此將這些動做定義在了鎖當中,並把鎖定義成對象。函數

 

因此同步是隱示的鎖操做,而Lock對象是顯示的鎖操做,它的出現就替代了同步。線程

 

在以前的版本中使用Object類中wait、notify、notifyAll的方式來完成的。那是由於同步中的鎖是任意對象,因此操做鎖的等待喚醒的方法都定義在Object類中。對象

 

而如今鎖是指定對象Lock。因此查找等待喚醒機制方式須要經過Lock接口來完成。而Lock接口中並無直接操做等待喚醒的方法,而是將這些方式又單獨封裝到了一個對象中。這個對象就是Condition,將Object中的三個方法進行單獨的封裝。並提供了功能一致的方法 await()、signal()、signalAll()體現新版本對象的好處。接口

< java.util.concurrent.locks > Condition接口:await()、signal()、signalAll();同步

--------------------------------------------------------it

class BoundedBuffer {io

   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();

     }

   }

 }

相關文章
相關標籤/搜索