java併發-獨佔鎖與共享鎖

1 鎖的獨佔與共享

      Java併發包提供的加鎖模式分爲獨佔鎖和共享鎖,獨佔鎖模式下,每次只能有一個線程能持有鎖,ReentrantLock就是以獨佔方式實現的互斥鎖。共享鎖,則允許多個線程同時獲取鎖,併發訪問 共享資源,如:ReadWriteLock。AQS的內部類Node定義了兩個常量SHARED和EXCLUSIVE,他們分別標識 AQS隊列中等待線程的鎖獲取模式。

     很顯然,獨佔鎖是一種悲觀保守的加鎖策略,它避免了讀/讀衝突,如果某個只讀線程獲取鎖,則其他讀線程都只能等待,這種情況下就限制了不必要的併發性,因爲讀操作並不會影響數據的一致性。共享鎖則是一種樂觀鎖,它放寬了加鎖策略,允許多個執行讀操作的線程同時訪問共享資源。 java的併發包中提供了ReadWriteLock,讀-寫鎖。它允許一個資源可以被多個讀操作訪問,或者被一個 寫操作訪問,但兩者不能同時進行。

2 鎖的公平與非公平

     鎖的公平與非公平,是指線程請求獲取鎖的過程中,是否允許插隊。在公平鎖上,線程將按他們發出請求的順序來獲得鎖;而非公平鎖則允許在線程發出請求後立即嘗試獲取鎖,如果可用則可直接獲取鎖,嘗試失敗才進行排隊等待。ReentrantLock提供了兩種鎖獲取方式,FairSyn和NofairSync。結論:ReentrantLock是以獨佔鎖的加鎖策略實現的互斥鎖,同時它提供了公平和非公平兩種鎖獲取方式。最初看源碼時竟然把這兩個概念弄混了。

 3 AQS提供的模板方法

    AQS提供了獨佔鎖和共享鎖必須實現的方法,具有獨佔鎖功能的子類,它必須實現tryAcquire、tryRelease、isHeldExclusively等;共享鎖功能的子類,必須實現tryAcquireShared和tryReleaseShared等方法,帶有Shared後綴的方法都是支持共享鎖加鎖的語義。Semaphore是一種共享鎖,ReentrantLock是一種獨佔鎖。

    獨佔鎖獲取鎖時,設置節點模式爲Node.EXCLUSIVE

[java] view plain copy
  1. public final void acquire(int arg) {  
  2.         if (!tryAcquire(arg) &&  
  3.             acquireQueued(addWaiter(Node.EXCLUSIVE), arg))  
  4.             selfInterrupt();  
  5.     }  

    共享鎖獲取鎖,節點模式則爲Node.SHARED

[java] view plain copy
  1.  private void doAcquireShared(int arg) {  
  2.     final Node node = addWaiter(Node.SHARED);  
  3.     boolean failed = true;  
  4.     .....  
  5. }  

 4  對ConditionObject的認識

     ReentrantLock是獨佔鎖,而且AQS的ConditionObject只能與ReentrantLock一起使用,它是爲了支持條件隊列的鎖更方便。ConditionObject的signal和await方法都是基於獨佔鎖的,如果線程非鎖的獨佔線程,則會拋出IllegalMonitorStateException。例如signalAll源碼:

[java] view plain copy
  1. public final void signalAll() {  
  2.     if (!isHeldExclusively())  
  3.         throw new IllegalMonitorStateException();  
  4.     Node first = firstWaiter;  
  5.     if (first != null)  
  6.         doSignalAll(first);  
  7. }  

      我在想,既然Condtion是爲了支持Lock的,爲什麼ConditionObject不作爲ReentrantLock的內部類呢?對於實現鎖功能的子類,直接擴展它就可以實現對條件隊列的支持。但是,對於其它非鎖語義的實現類如Semaphore、CountDownLatch等類來說,條件隊列是無用的,也會給開發者擴展AQS帶來困惑。總之,是各有利弊,大師們的思想,還需要仔細揣摩啊!

http://blog.csdn.net/wojiushiwo945you/article/details/42292999

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章