首页 > 基础资料 博客日记
JUC并发编程学习笔记(八)读写锁
2023-11-04 15:42:42基础资料围观553次
这篇文章介绍了JUC并发编程学习笔记(八)读写锁,分享给大家做个参考,收藏Java资料网收获更多编程知识
读写锁
ReadWriteLock
ReadWriteLock只存在一个实现类那就是ReentrantReadWriteLock,他可以对锁实现更加细粒化的控制
读的时候可以有多个阅读器线程同时参与,写的时候只希望写入线程是独占的

Demo:
package org.example.rw;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class ReadWriteLockDemo {
/*
* 读读 - 可以共存 (共享锁)
* 读写 - 不能共存 (独占锁)
* 写写 - 不能共存 (独占锁)
* */
public static void main(String[] args) {
MyCache myCache = new MyCache();
// 写入:要求在写入时不能存在插队的情况,以防止写入时资源被抢占
for (int i = 1; i <= 5; i++) {
final int temp = i;
new Thread(()->{
myCache.put(""+temp,temp);
},String.valueOf(i)).start();
}
// 读取:可以插队抢占资源以实现资源的最大化利用
for (int i = 1; i <= 5; i++) {
final int temp = i;
new Thread(()->{
myCache.get(temp+"");
},String.valueOf(i)).start();
}
}
}
class MyCache{
private volatile Map<String,Object> cache = new HashMap<>();
ReadWriteLock rwLock = new ReentrantReadWriteLock();
// 细粒化控制:写 - 只希望同一时间只有一条线程写入,写入完成后再进入下一位
public void put(String key,Object value){
rwLock.writeLock().lock();
try {
System.out.println(Thread.currentThread().getName()+":"+key+"开始写入");
cache.put(key,value);
System.out.println(Thread.currentThread().getName()+":"+key+"写入完成");
}catch (Exception e){
e.printStackTrace();
}finally {
rwLock.writeLock().unlock();
}
}
// 细粒化控制:读 - 所有人都可以读
public Object get(String key){
rwLock.readLock().lock();
Object o = null;
try {
System.out.println(Thread.currentThread().getName()+":"+key+"开始读取");
o = cache.get(key);
System.out.println(Thread.currentThread().getName()+":"+key+"读取完成");
}catch (Exception e){
e.printStackTrace();
}finally {
rwLock.readLock().unlock();
}
return o;
}
}
文章来源:https://www.cnblogs.com/nhgtx/p/17805996.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- springboot~传统WEB应用开启CSRF
- 剑指offer-57、二叉树的下一个节点
- 【开源工具分享】一款开源的高效PDF合并与图片转换工具:mergePDF,一款轻量级桌面可视化工具,支持将多个PDF文件合并为单一PDF,也可将PDF转换为图片格式,并提供“单张图片”与“长图片”两种
- 剑指offer-56、删除链表中重复的节点
- jvm~分析gc老年代内存过高的原因
- Java 哪些情况会导致内存泄漏
- Spring AOP + Guava RateLimiter:我是如何用注解实现优雅限流的?
- 回溯算法总结
- Java 操作 Markdown(1)--commonmark-java 使用
- 分库分表数据源ShardingSphereDataSource的Connection元数据误用问题分析

