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


Java ReadWriteLock用法及代碼示例


鎖是一種用於命令多個線程訪問指定資源的設備。通常,鎖授予對共享資源的獨占訪問權限:閃存中隻有一個線程可以獲得鎖,並且每個訪問共享資源的人都需要首先獲取鎖。不過,某些鎖可能允許並行訪問共享資源,例如 ReadWriteLock 的讀鎖。

ReadWriteLock 是一個接口。 ReadWriteLock由java.util.concurrent.locks包中的ReentrantReadWriteLock類實現。因此,要使用ReadWriteLock,我們必須使用ReentrantReadWriteLock。

java.util.concurrent.locks.ReadWriteLock 是一個高級線程鎖定工具。它允許多個線程讀取特定資源,但一次隻允許一個線程寫入。

該方法是,多個線程可以從共享資源中讀取數據,而不會導致並發錯誤。當對共享資源的寫入和讀取同時發生,或者多個寫入同時發生時,首先會發生並發錯誤。

規則:

讀鎖和寫鎖允許線程鎖定ReadWriteLock以進行讀或寫。

  1. 讀鎖:如果沒有線程請求寫鎖和寫鎖,那麽多個線程可以鎖定讀鎖。這意味著多個線程可以同時讀取數據,隻要沒有線程寫入數據或更新數據。
  2. 寫鎖:如果沒有線程在寫入或讀取,則某一時刻隻有一個線程可以鎖定寫入鎖。其他線程必須等待直到鎖被釋放。這意味著,此時隻有一個線程可以寫入數據,其他線程必須等待。

方法:ReadWritelock提供了兩種方法:

  1. 鎖readLock()
  2. 鎖writeLock()

他們的作品和他們的名字很相似。 readLock()用於在讀取時獲取鎖:

Lock readLock = rwLock.readLock();

對執行讀操作的代碼塊使用讀鎖:

Java


readLock.lock(); 
try { 
   // statements  
}  
finally { 
   readLock.unlock(); 
}

並且,writeLock() 用於在寫入時獲取鎖:

Lock writeLock = rwLock.writeLock();

對執行寫操作的代碼塊使用寫鎖:

Java


writeLock.lock(); 
try { 
    statements to write the data 
}  
finally { 
    writeLock.unlock(); 
}

執行:

Java


// Implementation of ReadWriteLock in Java 
import java.io.*; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.concurrent.locks.Lock; 
import java.util.concurrent.locks.ReadWriteLock; 
import java.util.concurrent.locks.ReentrantReadWriteLock; 
class GFG<O> { 
  
    private final ReadWriteLock readWriteLock 
        = new ReentrantReadWriteLock(); 
    private final Lock writeLock 
        = readWriteLock.writeLock(); 
    private final Lock readLock = readWriteLock.readLock(); 
    private final List<O> list = new ArrayList<>(); 
  
    // setElement function sets 
    // i.e., write the element to the thread 
    public void setElement(O o) 
    { 
        // acquire the thread for writing 
        writeLock.lock(); 
        try { 
            list.add(o); 
            System.out.println( 
                "Element by thread "
                + Thread.currentThread().getName() 
                + " is added"); 
        } 
        finally { 
            // To unlock the acquired write thread 
            writeLock.unlock(); 
        } 
    } 
  
    // getElement function prints 
    // i.e., read the element from the thread 
    public O getElement(int i) 
    { 
        // acquire the thread for reading 
        readLock.lock(); 
        try { 
            System.out.println( 
                "Elements by thread "
                + Thread.currentThread().getName() 
                + " is printed"); 
            return list.get(i); 
        } 
        finally { 
            // To unlock the acquired read thread 
            readLock.unlock(); 
        } 
    } 
    public static void main(String[] args) 
    { 
        GFG<String> gfg = new GFG<>(); 
  
        gfg.setElement("Hi"); 
        gfg.setElement("Hey"); 
        gfg.setElement("Hello"); 
  
        System.out.println("Printing the last element : "
                           + gfg.getElement(2)); 
    } 
}
輸出
Element by thread main is added
Element by thread main is added
Element by thread main is added
Elements by thread main is printed
Printing the last element : Hello


相關用法


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