鎖是一種用於命令多個線程訪問指定資源的設備。通常,鎖授予對共享資源的獨占訪問權限:閃存中隻有一個線程可以獲得鎖,並且每個訪問共享資源的人都需要首先獲取鎖。不過,某些鎖可能允許並行訪問共享資源,例如 ReadWriteLock 的讀鎖。
ReadWriteLock 是一個接口。 ReadWriteLock由java.util.concurrent.locks包中的ReentrantReadWriteLock類實現。因此,要使用ReadWriteLock,我們必須使用ReentrantReadWriteLock。
java.util.concurrent.locks.ReadWriteLock 是一個高級線程鎖定工具。它允許多個線程讀取特定資源,但一次隻允許一個線程寫入。
該方法是,多個線程可以從共享資源中讀取數據,而不會導致並發錯誤。當對共享資源的寫入和讀取同時發生,或者多個寫入同時發生時,首先會發生並發錯誤。
規則:
讀鎖和寫鎖允許線程鎖定ReadWriteLock以進行讀或寫。
- 讀鎖:如果沒有線程請求寫鎖和寫鎖,那麽多個線程可以鎖定讀鎖。這意味著多個線程可以同時讀取數據,隻要沒有線程寫入數據或更新數據。
- 寫鎖:如果沒有線程在寫入或讀取,則某一時刻隻有一個線程可以鎖定寫入鎖。其他線程必須等待直到鎖被釋放。這意味著,此時隻有一個線程可以寫入數據,其他線程必須等待。
方法:ReadWritelock提供了兩種方法:
- 鎖readLock()
- 鎖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
相關用法
- Java Reader mark()用法及代碼示例
- Java Reader skip()用法及代碼示例
- Java Reader close()用法及代碼示例
- Java Reader mark(int)用法及代碼示例
- Java Reader markSupported()用法及代碼示例
- Java Reader read()用法及代碼示例
- Java Reader read(CharBuffer)用法及代碼示例
- Java Reader ready()用法及代碼示例
- Java Reader reset()用法及代碼示例
- Java Reader skip(long)用法及代碼示例
- Java Reader read(char[])用法及代碼示例
- Java Reader read(char[], int, int)用法及代碼示例
- Java Reactive Programming用法及代碼示例
- Java Reentrant getQueueLength()用法及代碼示例
- Java ReentrantLock getHoldCount()用法及代碼示例
- Java ReentrantLock getOwner()用法及代碼示例
- Java ReentrantLock hasQueuedThread()用法及代碼示例
- Java ReentrantLock hasQueuedThreads()用法及代碼示例
- Java ReentrantLock isFair()用法及代碼示例
- Java ReentrantLock isHeldByCurrentThread()用法及代碼示例
- Java ReentrantLock isLocked()用法及代碼示例
- Java ReentrantLock lock()用法及代碼示例
- Java ReentrantLock lockInterruptibly()用法及代碼示例
- Java ReentrantLock toString()用法及代碼示例
- Java ReentrantLock tryLock()用法及代碼示例
注:本文由純淨天空篩選整理自ishagoyal2199大神的英文原創作品 ReadWriteLock Interface in Java。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。