10.ReadWriteLock 读写锁
读-写锁 ReadWriteLock
代码语言:javascript复制- ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有 writer,读取锁可以由多个 reader 线程同时保持。写入锁是独占的。。
- ReadWriteLock 读取操作通常不会改变共享资源,但执行写入操作时,必须独占方式来获取锁。对于读取操作占多数的数据结构。ReadWriteLock 能提供比独占锁更高的并发性。而对于只读的数据结构,其中包含的不变性可以完全不需要考虑加锁操作。
示例代码
1.首先编写一个读写锁的示例
代码语言:javascript复制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个读取的线程
代码语言:javascript复制public class TestReadWriteLock {
public static void main(String[] args) {
//1.创建读写锁示例对象
ReadWriteLockDemo rw = new ReadWriteLockDemo();
//2.创建一个写入锁线程
new Thread(new Runnable() {
@Override
public void run() {
rw.set((int)(Math.random() * 101)); // 随机设置值
}
}, "Write:").start();
//2.创建100个读线程,查看读取的值是否一致
for (int i = 0; i < 100; i ) {
new Thread(new Runnable() {
@Override
public void run() {
rw.get();
}
}).start();
}
}
}
测试执行如下:
image-20201104000012335
3.完整的示例代码
代码语言:javascript复制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() {
@Override
public void run() {
rw.set((int)(Math.random() * 101)); // 随机设置值
}
}, "Write:").start();
//2.创建100个读线程,查看读取的值是否一致
for (int i = 0; i < 100; i ) {
new Thread(new Runnable() {
@Override
public 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(); // 释放写锁
}
}
}