读写锁
概念定义:
读锁:共享锁,指多个线程可以同时占有锁,进行数据读取操作。
写锁:独占锁,指同时只能单个线程占有锁,进行写操作。
读写锁优点:
提高线程读写效率
读锁与写锁关系:
可以多个线程同时读锁
只能单个线程写锁
读锁和写锁只能单个线程进行
实例:
/**
* 文件名: com.example.demo.JucDemo - Demo6
* 文件简介: 读写锁
* @author zhouyunjian
* @date 23:29 2020/4/15
* Copyright (c) 2019 ERAYT. All Rights Reserved.
*/
public class Demo6 {
public static void main(String[] args) {
Ticket ticket=new Ticket();
new Thread(()->{
for (int i=0;i<10;i++){
ticket.write();
}
}).start();
new Thread(()->{
for (int i=0;i<10;i++){
ticket.read();
}
}).start();
new Thread(()->{
for (int i=0;i<10;i++){
ticket.read();
}
}).start();
}
}
class Ticket{
private int num=5;
private ReadWriteLock lock=new ReentrantReadWriteLock();
public void write(){
lock.writeLock().lock();
try {
System.out.println("=========写锁处理开始:"+num);
num++;
System.out.println("=========写锁处理结束"+num);
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("====写锁释放");
lock.writeLock().unlock();
}
}
public void read(){
lock.writeLock().lock();
try {
System.out.println("=========读锁开始:"+num);
System.out.println("=========读锁结束:"+num);
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("====读锁释放");
lock.writeLock().unlock();
}
}
}
测试结果:
=========写锁处理开始:5
=========写锁处理结束6
====写锁释放
=========写锁处理开始:6
=========写锁处理结束7
====写锁释放
=========写锁处理开始:7
=========写锁处理结束8
====写锁释放
=========写锁处理开始:8
=========写锁处理结束9
====写锁释放
=========写锁处理开始:9
=========写锁处理结束10
====写锁释放
=========写锁处理开始:10
=========写锁处理结束11
====写锁释放
=========写锁处理开始:11
=========写锁处理结束12
====写锁释放
=========写锁处理开始:12
=========写锁处理结束13
====写锁释放
=========写锁处理开始:13
=========写锁处理结束14
====写锁释放
=========写锁处理开始:14
=========写锁处理结束15
====写锁释放
=========读锁开始:15
=========读锁结束:15
====读锁释放
=========读锁开始:15
=========读锁结束:15
====读锁释放
=========读锁开始:15
=========读锁结束:15
====读锁释放
=========读锁开始:15
=========读锁结束:15
====读锁释放
=========读锁开始:15
=========读锁结束:15
====读锁释放
=========读锁开始:15
=========读锁结束:15
====读锁释放
=========读锁开始:15
=========读锁结束:15
====读锁释放
=========读锁开始:15
=========读锁结束:15
====读锁释放
=========读锁开始:15
=========读锁结束:15
====读锁释放
=========读锁开始:15
=========读锁结束:15
====读锁释放
=========读锁开始:15
=========读锁结束:15
====读锁释放
=========读锁开始:15
=========读锁结束:15
====读锁释放
=========读锁开始:15
=========读锁结束:15
====读锁释放
=========读锁开始:15
=========读锁结束:15
====读锁释放
=========读锁开始:15
=========读锁结束:15
====读锁释放
=========读锁开始:15
=========读锁结束:15
====读锁释放
=========读锁开始:15
=========读锁结束:15
====读锁释放
=========读锁开始:15
=========读锁结束:15
====读锁释放
=========读锁开始:15
=========读锁结束:15
====读锁释放
=========读锁开始:15
=========读锁结束:15
====读锁释放
疑问点:
1.为何需要读写锁?
普通的锁没有读写之分,加锁时其它线程无法持有,并发效率较低;读写锁支持多个线程同时读取,提高并发效率。
2.读锁有何作用?
读锁过程中,无法写锁,可以保证数据一致性;如果无读锁,则可能导致读取过程中数据不一致性