当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。