本文主要是介绍10.ReadWriteLock 读写锁,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
10.ReadWriteLock 读写锁
读-写锁 ReadWriteLock
- ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有 writer,读取锁可以由多个 reader 线程同时保持。写入锁是独占的。。- ReadWriteLock 读取操作通常不会改变共享资源,但执行写入操作时,必须独占方式来获取锁。对于读取操作占多数的数据结构。ReadWriteLock 能提供比独占锁更高的并发性。而对于只读的数据结构,其中包含的不变性可以完全不需要考虑加锁操作。
示例代码
1.首先编写一个读写锁的示例
class ReadWriteLockDemo{//成员属性private int number = 0; // 定义一个用于读写的值//创建读写锁private ReadWriteLock lock = new ReentrantReadWriteLock();//读:设置读锁public void get(){lock.readLock().lock(); //设置读锁try{System.out.println(Thread.currentThread().getName() + " : " + number + " ,当前时间: " + System.currentTimeMillis());}finally{lock.readLock().unlock(); //释放读锁}}//写:设置写入锁public void set(int number){lock.writeLock().lock(); // 设置写入锁try{System.out.println(Thread.currentThread().getName());this.number = number; // 设置值}finally{lock.writeLock().unlock(); // 释放写锁}}
}
2.创建一个写入的线程 和 100个读取的线程
public class TestReadWriteLock {public static void main(String[] args) {//1.创建读写锁示例对象ReadWriteLockDemo rw = new ReadWriteLockDemo();//2.创建一个写入锁线程new Thread(new Runnable() {@Overridepublic void run() {rw.set((int)(Math.random() * 101)); // 随机设置值}}, "Write:").start();//2.创建100个读线程,查看读取的值是否一致for (int i = 0; i < 100; i++) {new Thread(new Runnable() {@Overridepublic void run() {rw.get();}}).start();}}
}
测试执行如下:
3.完整的示例代码
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;/*** 1. ReadWriteLock : 读写锁** 写写/读写 需要“互斥”* 读读 不需要互斥** @author Aron.li* @date 2020/11/3 23:52*/
public class TestReadWriteLock {public static void main(String[] args) {//1.创建读写锁示例对象ReadWriteLockDemo rw = new ReadWriteLockDemo();//2.创建一个写入锁线程new Thread(new Runnable() {@Overridepublic void run() {rw.set((int)(Math.random() * 101)); // 随机设置值}}, "Write:").start();//2.创建100个读线程,查看读取的值是否一致for (int i = 0; i < 100; i++) {new Thread(new Runnable() {@Overridepublic void run() {rw.get();}}).start();}}
}class ReadWriteLockDemo{//成员属性private int number = 0; // 定义一个用于读写的值//创建读写锁private ReadWriteLock lock = new ReentrantReadWriteLock();//读:设置读锁public void get(){lock.readLock().lock(); //设置读锁try{System.out.println(Thread.currentThread().getName() + " : " + number + " ,当前时间: " + System.currentTimeMillis());}finally{lock.readLock().unlock(); //释放读锁}}//写:设置写入锁public void set(int number){lock.writeLock().lock(); // 设置写入锁try{System.out.println(Thread.currentThread().getName());this.number = number; // 设置值}finally{lock.writeLock().unlock(); // 释放写锁}}
}
这篇关于10.ReadWriteLock 读写锁的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!