Juc并发编程-关于读写锁分析与问题思考

读写锁

 

概念定义:

读锁:共享锁,指多个线程可以同时占有锁,进行数据读取操作。

写锁:独占锁,指同时只能单个线程占有锁,进行写操作。

 

读写锁优点:

提高线程读写效率

 

读锁与写锁关系:

可以多个线程同时读锁

只能单个线程写锁

读锁和写锁只能单个线程进行

 

实例:

/**

* 文件名: 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.读锁有何作用?

读锁过程中,无法写锁,可以保证数据一致性;如果无读锁,则可能导致读取过程中数据不一致性

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值