读写锁 ReadWriteLock
-
ReadWriteLock
维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有writer
,读取锁可以由多个reader
线程同时保持,而写入锁是独占的。 -
ReadWriteLock
读取操作通常不会改变共享资源,但执行写入操作时,必须独占方式来获取锁。对于读取操作占多数的数据结构。ReadWriteLock
能提供比独占锁更高的并发性。而对于只读的数据结构,其中包含的不变性可以完全不需要考虑加锁操作。 -
示例:
import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class TestReadWriteLock { public static void main(String[] args) { ReadAndWriteNum rw = new ReadAndWriteNum(); // 创建一个写线程 new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(2); rw.write((int)(Math.random() * 100)); } catch (InterruptedException e) { e.printStackTrace(); } } },"Write").start(); // 创建多个读线程 for (int i = 0; i < 50; i++) { new Thread(new Runnable() { @Override public void run() { rw.read(); } },"Read").start(); } } } class ReadAndWriteNum { private int num; // 创建读写锁 private ReadWriteLock lock = new ReentrantReadWriteLock(); // 读方法 public void read() { // 上锁(读) lock.readLock().lock(); try { System.out.println(Thread.currentThread().getName() + " : " + num); } finally { // 释放锁(读) lock.readLock().unlock(); } } // 写方法 public void write(int num) { // 上锁(写) lock.writeLock().lock(); try { this.num = num; System.out.println(Thread.currentThread().getName() + " : " + this.num); } finally { // 释放锁(写) lock.writeLock().unlock(); } } }
- 运行结果:
- 运行结果: