當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Java ReentrantReadWriteLock用法及代碼示例


Java 的 ReentrantReadWriteLock 類是 ReadWriteLock 的實現,它也支持 ReentrantLock 函數。

ReadWriteLock 是一對關聯鎖,一個用於隻讀操作,一個用於寫入操作。而 ReentrantLock 是一個可重入互斥鎖,其行為與使用同步方法和語句訪問的隱式監視器鎖相同,但具有一些更多的擴展函數。

Java 中的ReadWriteLock

即使在多線程應用程序中,共享資源也可能同時發生多個讀取。隻有當多個寫入同時發生或讀寫混合時,才有可能寫入錯誤值或讀取錯誤值。

Java 中的 ReadWriteLock 使用相同的想法,通過使用單獨的鎖對來提高性能。 ReadWriteLock 維護一對關聯的鎖 -

  1. 一個用於隻讀操作;和
  2. 一個用於寫作。

隻要沒有寫入者,讀取鎖就可以由多個讀取者線程同時持有。寫鎖是獨占的。

擁有一對 read-write lock 可以在訪問共享數據時實現比互斥鎖更高級別的並發性。它利用了這樣一個事實:雖然一次隻有一個線程(寫入線程)可以修改共享數據,但在許多情況下,任意數量的線程可以同時讀取數據(因此是讀取線程)。

如果讀取的頻率大於寫入的頻率、讀取操作的持續時間大於寫入的持續時間,則讀寫鎖將比使用互斥鎖提高性能。它還取決於數據的爭用,即嘗試同時讀取或寫入數據的線程數量。

包資源管理器視圖

• java.lang.Object
    • java.util.concurrent.locks.ReentrantReadWriteLock

用法:導入類

public class ReentrantReadWriteLock
extends Object
implements ReadWriteLock, Serializable

構造函數總結

  1. ReentrantReadWriteLock():創建具有默認(非公平)排序屬性的新ReentrantReadWriteLock。
  2. ReentrantReadWriteLock(boolean fair):使用給定的公平策略創建一個新的ReentrantReadWriteLock。

拋出異常:

執行:

我們將創建三個 Runnable 實現。它們都使用ReentrantReadWriteLock 鎖定變量。該鎖是使用 ReentrantReadWriteLock(boolean fair) 構造函數創建的,因此它被賦予了公平策略:

  • 讀得到鎖。它使用ReentrantReadWriteLock的readLock() API方法來獲取ReadLock。然後,它使用ReadLock的lock()方法獲取讀鎖。在獲得鎖的同時,它讀取字符串消息變量的值。然後它嘗試使用 ReadLock 的 unlock() 方法釋放鎖。
  • WriteA 和 WriteB 也都獲得鎖,使用 writeLock() 方法返回一個 WriteLock,然後使用 WriteLock 的 unlock() 方法。由於具有寫鎖,它們都改變了字符串消息變量的值。然後,他們使用 WriteLock 的 unlock() 方法釋放寫鎖。

示例

Java


// Java Program to Illustrate ReentrantReadWriteLock Class
// Importing ReentrantReadWriteLock
// fro java.util package
import java.util.concurrent.locks.ReentrantReadWriteLock;
// Class 1
// Main class
public class ReentrantReadWriteLockExample {
    private static final ReentrantReadWriteLock lock
        = new ReentrantReadWriteLock(true);
    // Initially the string contains only 1 character
    private static String message = "a";
    // Main driver method
    public static void main(String[] args)
        throws InterruptedException
    {
        // Creating threads
        Thread t1 = new Thread(new Read());
        Thread t2 = new Thread(new WriteA());
        Thread t3 = new Thread(new WriteB());
        // Starting threads with help of start() method
        t1.start();
        t2.start();
        t3.start();
        t1.join();
        t2.join();
        t3.join();
    }
    // Class 2
    // Helper class implementing Runnable interface
    static class Read implements Runnable {
        // run() method for thread
        public void run()
        {
            for (int i = 0; i <= 10; i++) {
                if (lock.isWriteLocked()) {
                    System.out.println(
                        "I'll take the lock from Write");
                }
                // operating lock()
                lock.readLock().lock();
                System.out.println(
                    "ReadThread "
                    + Thread.currentThread().getId()
                    + "Message is " + message);
                lock.readLock().unlock();
            }
        }
    }
    // Class 3
    // Helper class implementing Runnable interface
    static class WriteA implements Runnable {
        // run() method for thread
        public void run()
        {
            for (int i = 0; i <= 10; i++) {
                // Try block to check fr exceptions
                try {
                    lock.writeLock().lock();
                    message = message.concat("a");
                }
                finally {
                    lock.writeLock().unlock();
                }
            }
        }
    }
    // Class 4
    // Helper class implementing Runnable interface
    static class WriteB implements Runnable {
        // run() method for thread
        public void run()
        {
            for (int i = 0; i <= 10; i++) {
                // Try block to check for exceptions
                try {
                    lock.writeLock().lock();
                    message = message.concat("b");
                }
                finally {
                    lock.writeLock().unlock();
                }
            }
        }
    }
}
輸出
ReadThread 11 ---> Message is a
ReadThread 11 ---> Message is aba
ReadThread 11 ---> Message is ababa
ReadThread 11 ---> Message is abababa
ReadThread 11 ---> Message is ababababa
ReadThread 11 ---> Message is abababababa
ReadThread 11 ---> Message is ababababababa
ReadThread 11 ---> Message is abababababababa
ReadThread 11 ---> Message is ababababababababa
ReadThread 11 ---> Message is abababababababababa
ReadThread 11 ---> Message is ababababababababababa


相關用法


注:本文由純淨天空篩選整理自praveen13kulkarni大神的英文原創作品 ReentrantReadWriteLock Class in Java。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。