Java JUC并发之读写锁
时间:2021-07-15
本文章向大家介绍Java JUC并发之读写锁,主要包括Java JUC并发之读写锁使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
九、读写锁 ReadWriteLock
Read Lock 读锁 (共享锁)=> 允许多个线程一起读 读的时候不允许写操作
Write Lock 写锁 (独占锁)=> 只允许一个线程(独家)写的时候不允许读操作
读写锁的目的: 保证线程安全 读写分离
package com.liu.rw;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* 独占锁(排他锁) 写锁 一次只能被一个线程占有
* 共享锁 读锁 多个线程同时占有
* ReadWriteLock 读写锁
* 读-读 可以共存!
* 读-写 不能共存 读写分离
* 写-写 不能共存
*/
public class ReadWriteLockDemo {
public static void main(String[] args) {
MyCacheLock myCache = new MyCacheLock();
// 写入操作
for (int i = 1; i <= 10; i++) {
final String temp = String.valueOf(i);
new Thread(()->{
myCache.put(temp,temp);
},String.valueOf(i)).start();
}
// 读取操作
for (int i = 1; i <= 10; i++) {
final String temp = String.valueOf(i);
new Thread(()->{
myCache.get(temp);
},String.valueOf(i)).start();
}
}
}
/**
* 自定义缓存 get set 使用Map
*/
class MyCache{
private volatile Map<String, Object> map = new HashMap<>();
// 存 写
public void put(String key, Object value) {
System.out.println(Thread.currentThread().getName() + "写入");
map.put(key, value);
System.out.println(Thread.currentThread().getName() + "写入完毕!");
}
// 读 取
public void get(String key) {
System.out.println(Thread.currentThread().getName() + "读取");
Object o = map.get(key);
System.out.println(Thread.currentThread().getName() + "读取完毕!");
}
}
class MyCacheLock{
private volatile Map<String, Object> map = new HashMap<>();
// 读写锁 更加细粒度的操作
private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
// private ReentrantLock lock = new ReentrantLock(); // 一般的可重入锁
// 存 写
// 写入的时候,只希望同时只有一个线程写
public void put(String key, Object value) {
readWriteLock.writeLock().lock(); // 加一个读写锁的写锁
try {
System.out.println(Thread.currentThread().getName() + "写入");
map.put(key, value);
System.out.println(Thread.currentThread().getName() + "写入完毕!");
} catch (Exception e) {
e.printStackTrace();
} finally {
readWriteLock.writeLock().unlock(); // 解锁
}
}
// 读 取 加读锁的的目的:防止产生脏数据(写入的时候有读操作)
// 所有人都可以读
public void get(String key) {
readWriteLock.readLock().lock(); // 加 读锁
try {
System.out.println(Thread.currentThread().getName() + "读取");
Object o = map.get(key);
System.out.println(Thread.currentThread().getName() + "读取完毕!");
} catch (Exception e) {
e.printStackTrace();
} finally {
readWriteLock.readLock().unlock(); // 解锁
}
}
}
本文来自博客园,作者:{夕立君},转载请注明原文链接:https://www.cnblogs.com/liuzhhhao/p/15016479.html
原文地址:https://www.cnblogs.com/liuzhhhao/p/15016479.html
- Go语言服务器开发之简易TCP客户端与服务端实现方法
- 移动搜索SEO分享:PHP自动生成百度开放适配及360移动适配专用的Sitemap文件
- 分享两种外链跳转方法,可避免权重流失。
- go语言十大排序算法总结
- 网站安全检测提示“页面异常导致本地路径泄漏”的解决办法
- Go语言归并排序算法实现
- 超強统计插件:My Visitors在知更鸟主题下的修改教程
- 让知更鸟主题的分类图标支持二级分类
- nwui —— 又一个go语言图形界面解决方案
- 分享博客统计中的动态运行天数代码
- GO语言标准错误处理机制error用法实例
- go的websocket实现原理与用法详解
- 分享张戈博客的在线影音源代码
- go语言base64加密解密的方法
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- shell 加密传输 | Linux后门系列
- msf反弹一把梭 | Linux后门系列
- IDEA 远程调试
- 不落地反弹meterpreter | Linux后门系列
- rsyslog的安装、使用、详解
- Nmap NSE 库分析 >>> stdnse
- 安装系统小记
- Nmap NSE 库分析 >>> nmap
- 深入讲解Logback
- python pty & magic | 加固shell
- 通达OA伪造SESSION | Nmap脚本
- Postman使用完全指南
- meterpreter shell | 加固shell
- R语言绘图:复杂散点图绘制
- windows下部署sentinel模式的Redis主从集群