JUC中的读写锁
时间:2021-07-21
本文章向大家介绍JUC中的读写锁,主要包括JUC中的读写锁使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
package readwrite;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
class Mycache {
private volatile Map<String, Object> map = new HashMap<>();
private ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
public void put(String key, Object value) {
//添加写锁
readWriteLock.writeLock().lock();
try {
System.out.println(Thread.currentThread().getName() + "正在写操作" + key);
TimeUnit.MICROSECONDS.sleep(300);
//写数据
map.put(key, value);
System.out.println(Thread.currentThread().getName() + "写完了" + key);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
readWriteLock.writeLock().unlock();
}
}
//取数据
public Object get(String key) {
//添加读锁
readWriteLock.writeLock().lock();
Object result = null;
try {
System.out.println(Thread.currentThread().getName() + "正在读操作" + key);
TimeUnit.MICROSECONDS.sleep(300);
result = map.get(key);
System.out.println(Thread.currentThread().getName() + "读完了" + key);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
readWriteLock.writeLock().unlock();
return result;
}
}
}
public class ReadWriteLock {
public static void main(String[] args) {
Mycache mycache = new Mycache();
//放数据
for (int i = 1; i <= 5; i++) {
final int num = i;
new Thread(() -> {
mycache.put(num + "", num + " ");
}, String.valueOf(i)).start();
}
//取数据
for (int i = 0; i < 4; i++) {
final int num = i;
new Thread(() -> {
mycache.get(num + "");
}, String.valueOf(i)).start();
}
}
}
/**
* 添加读写锁之前
* 1正在读操作1
* 3正在写操作3
* 3正在读操作3
* 0正在读操作0
* 5正在写操作5
* 4正在写操作4
* 2正在读操作2
* 2正在写操作2
* 1正在写操作1
* 3取完了3
* 3写完了3
* 1取完了1
* 4写完了4
* 2取完了2
* 5写完了5
* 0取完了0
* 2写完了2
* 1写完了1
**/
/**添加读写锁之后
*3正在读操作3
* 3取完了3
* 2正在写操作2
* 2写完了2
* 1正在写操作1
* 1写完了1
* 5正在写操作5
* 5写完了5
* 1正在读操作1
* 1取完了1
* 4正在写操作4
* 4写完了4
* 2正在读操作2
* 2取完了2
* 0正在读操作0
* 0取完了0
* 3正在写操作3
* 3写完了3
*/
要一直快乐
原文地址:https://www.cnblogs.com/chickenleg/p/15041007.html
- 017 Java中的静态代理、JDK动态代理、cglib动态代理
- 我的学习、归纳方法(以学习 Maven 为例)
- JDBC面试题都在这里
- 018 final 关键字的用途
- 04-01.总结switch,for,while,do。while跳转语句
- JDBC【介绍JDBC、使用JDBC连接数据库、简单的工具类】
- 019 单例模式的5种写法
- 图书管理系统【部署开发环境、解决分类、图书、前台页面模块】
- 图书管理系统【用户、购买、订单模块、添加权限】
- 04-02.总结switch,for,while,do。while跳转语句
- 图书管理系统【总结】
- JDBC【PreparedStatment、批处理、处理二进制、自动主键、调用存储过程、函数】
- JDBC【事务、元数据、改造JDBC工具类】
- JDBC【数据库连接池、DbUtils框架、分页】
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【LeetCode每日一题】24. Swap Nodes in Pairs
- 【LeetCode每日一题】26. Remove Duplicates from Sorted Array
- K8S 生态周报| NGINX Ingress Controller又添新特性
- 网络安全实验室平台(脚本关)
- shell 多线程及线程数控制实现
- CTF考点总结-sql注入篇
- dotnet OpenXML 为什么资源使用 Relationship 引用
- k8s部署Kafka集群
- 彻底搞懂 etcd 系列文章(六):etcd 核心 API v3
- Open3d学习计划—7(RGBD测程法)
- 一次信息泄露引发的越权
- MySQL 调优 | OPTIMIZER_TRACE 详解
- 这次被坑惨了,MySQL的隐式转换导致了一个线上BUG
- iOS开发之UIMenu
- mysql必会技能-基本操作