锁是一种用于命令多个线程访问指定资源的设备。通常,锁授予对共享资源的独占访问权限:闪存中只有一个线程可以获得锁,并且每个访问共享资源的人都需要首先获取锁。不过,某些锁可能允许并行访问共享资源,例如 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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。