1. 程式人生 > >java架構《並發線程高級篇四》

java架構《並發線程高級篇四》

finall 鎖定 並發 bsp 讀寫分離 stack 嘗試 getname spa

    本章主要講並發線程的常見的兩種鎖。重入鎖和讀寫鎖

一:重入鎖(ReentrantLock)

    概念:重入鎖,在需要進行同步的代碼加鎖,但最後一定不要忘記釋放鎖,否則會造成鎖永遠不能釋放,其他線程進不了

    代碼解析:

        實例化:Lock lock = new ReentrantLock();

        鎖定:lock .lock();

        釋放鎖:lock.unlock();

    代碼:

        

      private Lock lock = new ReentrantLock();

      public void method1(){
          try {
            lock.lock();
            System.out.println("當前線程:" + Thread.currentThread().getName() + "進入method1..");
            Thread.sleep(1000);
            System.out.println("當前線程:" + Thread.currentThread().getName() + "退出method1..");
            Thread.sleep(1000);
            } catch (InterruptedException e) {
              e.printStackTrace();
            } finally {

            lock.unlock();
          }
        }

    Condition類:配合重入鎖,阻塞和通知,不需要配合synchronized使用,比較靈活,支持多個線程鎖定,同時通知全部。

          阻塞和通知:

          private Lock lock = new ReentrantLock();

          private Condition condition = lock.newCondition();

          阻塞:condition.await();

          通知:condition.signal();

          通知全部:condition.signalall()

   Lock/Condition其他方法和用法:

        Lock lock=new ReentrantLock(boolean isFair);

            tryLock():嘗試獲得鎖,返回false/true

            tryLock():在給定的時間內嘗試獲得鎖,獲得結果用 true/false表示。

            isFair():返回是否是公平鎖 true/false

            isLocked():返回是否鎖定

            getHoldCount():返回當前線程保持此鎖的個數,或者說表示調用了lock()的次數

            lockinterruptibly():優先響應中斷的鎖

            getQueueLength():返回正在等待獲取此鎖定的線程數。

            getWaitQueueLength():返回等待與鎖定相關的給定條件Condition的線程數

            hasQueueThread(Thread t):查詢指定的線程是否正在等待此鎖

            hasQueueThreads():查詢是否有線程正在等待此鎖

            hasWaiters():查詢是否有線程正在等待與此鎖定有關的condition條件

二:讀寫鎖(ReentrantReadWriteLock)

     概念:其核心就是讀寫分離的鎖,在讀多寫少情況下,性能遠高於重入鎖 。口訣:讀讀共享,寫寫互斥,讀寫互斥

     代碼解析:

        實例化:       

          private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
          private ReadLock readLock = rwLock.readLock(); //獲取到讀鎖
          private WriteLock writeLock = rwLock.writeLock(); //獲取到寫鎖

        

    

java架構《並發線程高級篇四》