java學習筆記之多線程的鎖介面Lock

來源:互聯網
上載者:User

眾所周知,多線程的弊端是會使代碼受到並發訪問的幹擾,解決的辦法就是同步機制。同步的兩種常見形式分別是同步代碼塊和同步函數,兩種形式的鎖都是隱式鎖,前者持有的鎖可以是任意對象,後者持有的鎖是預設的this。

從JDK1.5開始,根據物件導向的思想,將鎖封裝了起來,對外提供Lock介面,並提供了對鎖的顯式操作。Lock介面的出現比synchronized有更多的操作,是同步的替代。

  將鎖單獨封裝的好處就是可以更靈活的使用鎖,Lock介面的實現允許鎖在不同的作用範圍內擷取和釋放,並允許以任何順序擷取和釋放多個鎖,從而支援使用這種技術。

查閱API,在java.util.concurrent.locks包裡可以查到Lock介面。主要的方法有

lock()--->擷取鎖。

    unlock()--->釋放鎖

 需要注意的是,synchronized實現同步的時候,當同步代碼結束,鎖自動釋放,但是使用lock介面實現同步就會失去鎖的自動釋放功能。如果同步的代碼塊拋出異常,鎖不能被釋放,會導致其他線程無法執行。因此必須將解鎖操作寫到finally子句中。

如何使用Lock介面實現同步呢。

   Lock介面的已知實作類別包括ReentrantLock,ReentrantReadWriteLock,ReentrantReadWriteLock.WriteLock.

Lock lock  = new ReentrantLock();

lock.lock();

try{

             ......;

        }

        finally{   

        lock.unlock();

        }

        如果用Lock介面實現同步,原同步代碼塊或同步函數中的wait();notify();notifyAll()方法就不能用了。根據物件導向的方法,將原來的同步監視器方法封裝到了condition對象中。而Lock介面的靈活之處體現在一個Lock介面可以支援多個condition對象,相對應的方法是await();signal();signalAll().

用法可以查看API的樣本

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


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.