Java 的 ReentrantReadWriteLock 類是 ReadWriteLock 的實現,它也支持 ReentrantLock 函數。
ReadWriteLock 是一對關聯鎖,一個用於隻讀操作,一個用於寫入操作。而 ReentrantLock 是一個可重入互斥鎖,其行為與使用同步方法和語句訪問的隱式監視器鎖相同,但具有一些更多的擴展函數。
Java 中的ReadWriteLock
即使在多線程應用程序中,共享資源也可能同時發生多個讀取。隻有當多個寫入同時發生或讀寫混合時,才有可能寫入錯誤值或讀取錯誤值。
Java 中的 ReadWriteLock 使用相同的想法,通過使用單獨的鎖對來提高性能。 ReadWriteLock 維護一對關聯的鎖 -
- 一個用於隻讀操作;和
- 一個用於寫作。
隻要沒有寫入者,讀取鎖就可以由多個讀取者線程同時持有。寫鎖是獨占的。
擁有一對 read-write lock 可以在訪問共享數據時實現比互斥鎖更高級別的並發性。它利用了這樣一個事實:雖然一次隻有一個線程(寫入線程)可以修改共享數據,但在許多情況下,任意數量的線程可以同時讀取數據(因此是讀取線程)。
如果讀取的頻率大於寫入的頻率、讀取操作的持續時間大於寫入的持續時間,則讀寫鎖將比使用互斥鎖提高性能。它還取決於數據的爭用,即嘗試同時讀取或寫入數據的線程數量。
包資源管理器視圖
• java.lang.Object • java.util.concurrent.locks.ReentrantReadWriteLock
用法:導入類
public class ReentrantReadWriteLock extends Object implements ReadWriteLock, Serializable
構造函數總結
- ReentrantReadWriteLock():創建具有默認(非公平)排序屬性的新ReentrantReadWriteLock。
- ReentrantReadWriteLock(boolean fair):使用給定的公平策略創建一個新的ReentrantReadWriteLock。
拋出異常:
- NullPointerException:如果鎖為空
執行:
我們將創建三個 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
相關用法
- 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()用法及代碼示例
- Java Reader mark()用法及代碼示例
- Java Reader skip()用法及代碼示例
- Java ResourceBundle clearCache()用法及代碼示例
- Java ResourceBundle containsKey()用法及代碼示例
- Java ResourceBundle getKeys()用法及代碼示例
- Java ResourceBundle getLocale()用法及代碼示例
- Java ResourceBundle getObject()用法及代碼示例
- Java ResourceBundle getString()用法及代碼示例
- Java ResourceBundle keySet()用法及代碼示例
- Java Reader close()用法及代碼示例
- Java Reader mark(int)用法及代碼示例
- Java Reader markSupported()用法及代碼示例
- Java Reader read()用法及代碼示例
注:本文由純淨天空篩選整理自praveen13kulkarni大神的英文原創作品 ReentrantReadWriteLock Class in Java。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。