JUC---04Lock(二)ReentrantReadWriteLock
1.读写锁
分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由jvm自己控制的,你只要上好相应的锁即可。如果你的代码只读数据,可以很多人同时读,但不能同时写,那就上读锁;如果你的代码修改数据,只能有一个人在写,且不能同时读取,那就上写锁。总之,读的时候上读锁,写的时候上写锁!
WriteLock可以获取ReadLock,但是ReadLock不能获取WriteLock
锁降级:写线程获取写入锁后可以获取读取锁,然后释放写入锁,这样就从写入锁变成了读取锁,从而实现锁降级的特性
2.核心方法
3.代码实现
1 package com.jenne.mydemo;
2
3 import java.util.HashMap;
4 import java.util.Map; 6 import java.util.concurrent.TimeUnit;
7 import java.util.concurrent.locks.ReadWriteLock;
8 import java.util.concurrent.locks.ReentrantReadWriteLock;
9
10
11 class MyCache {
12 private volatile Map<String, String> map = new HashMap<>();
13 private ReadWriteLock rwLock = new ReentrantReadWriteLock();
14
15
16 public void put(String key, String value) {
17 rwLock.writeLock().lock();//获取写锁
18 try {
19
20 System.out.println(Thread.currentThread().getName() + "--->准备写入数据--->" + key);
21 TimeUnit.MILLISECONDS.sleep(200);
22 map.put(key, value);
23 System.out.println(Thread.currentThread().getName() + "--->写入数据完成--->" + key);
24
25 } catch (Exception e) {
26 e.printStackTrace();
27 } finally {
28 rwLock.writeLock().unlock();//解除写锁
29 }
30 }
31
32 public void get(String key) {
33 rwLock.readLock().lock();//获取读锁
34 try {
35
36 System.out.println(Thread.currentThread().getName() + "--->准备读取数据--->" + key);
37 TimeUnit.MILLISECONDS.sleep(200);
38 String value = map.get(key);
39 System.out.println(Thread.currentThread().getName() + "--->读取数据完成--->" + value);
40
41 } catch (Exception e) {
42 e.printStackTrace();
43 } finally {
44 rwLock.readLock().unlock();//获取读锁
45 }
46 }
47 }
48
49 public class ReadWriteLockDemo {
50
51 public static void main(String[] args) throws InterruptedException {
52
53 MyCache myCache = new MyCache();
54
55 for (int i = 1; i <= 5; i++) {
56 String key = String.valueOf(i);
57
58 new Thread(() -> {
59 myCache.put(key, key);
60 }).start();
61 }
62
63 TimeUnit.SECONDS.sleep(2);
64
65 for (int i = 1; i <= 5; i++) {
66 String key = String.valueOf(i);
67 new Thread(() -> {
68 myCache.get(key);
69 }).start();
70 }
71
73 }
74 }
JUC---04Lock(二)ReentrantReadWriteLock的更多相关文章
- JUC(二):CAS及ABA
CAS是什么? 比较并交换. CAS示例 package com.chinda.java.audition; import java.util.concurrent.atomic.AtomicInte ...
- AQS系列(四)- ReentrantReadWriteLock读写锁的释放锁
前言 继续JUC包中ReentrantReadWriteLock的学习,今天学习释放锁. 一.写锁释放锁 入口方法 public void unlock() { sync.release(1); } ...
- JUC回顾之-AQS同步器的实现原理
1.什么是AQS? AQS的核心思想是基于volatile int state这样的volatile变量,配合Unsafe工具对其原子性的操作来实现对当前锁状态进行修改.同步器内部依赖一个FIFO的双 ...
- 你知道什么是JUC了吗?
多线程一直Java开发中的难点,也是面试中的常客,趁着还有时间,打算巩固一下JUC方面知识,我想机会随处可见,但始终都是留给有准备的人的,希望我们都能加油!!! 沉下去,再浮上来,我想我们会变的不一样 ...
- 最强Java并发编程详解:知识点梳理,BAT面试题等
本文原创更多内容可以参考: Java 全栈知识体系.如需转载请说明原处. 知识体系系统性梳理 Java 并发之基础 A. Java进阶 - Java 并发之基础:首先全局的了解并发的知识体系,同时了解 ...
- Java锁_读写锁
独占锁:是指锁一次只能被一个线程持有,ReentrantLock和Synchronized都是独占锁. 共享锁:是指锁可以被多个线程持有. 对于ReentrantReadWriteLock,其读锁是共 ...
- Java多线程系列--“JUC锁”08之 共享锁和ReentrantReadWriteLock
概要 Java的JUC(java.util.concurrent)包中的锁包括"独占锁"和"共享锁".在“Java多线程系列--“JUC锁”02之 互斥锁Ree ...
- Java - "JUC" ReentrantReadWriteLock
Java多线程系列--“JUC锁”08之 共享锁和ReentrantReadWriteLock ReadWriteLock 和 ReentrantReadWriteLock介绍 ReadWriteLo ...
- 6.JUC之ReentrantReadWriteLock
一.概述: Java纪年1.5年,ReentrantReadWriteLock诞生于JUC,此后,国人一般称它为读写锁.人如其名,他就是一个可重入锁,同时他还是一个读写锁 a)跟ReentrantLo ...
随机推荐
- zico2靶机渗透
zico2靶机渗透 开放了四个端口,分别是22,80,111以及57781端口. 扫到了目录http://192.168.114.152/dbadmin/ 进入看到php文件,访问,发现一个登录窗口. ...
- Spring Boot 自动配置的原理、核心注解以及利用自动配置实现了自定义 Starter 组件
本章内容 自定义属性快速入门 外化配置 自动配置 自定义创建 Starter 组件 摘录:读书是读完这些文字还要好好用心去想想,写书也一样,做任何事也一样 图 2 第二章目录结构图 第 2 章 Spr ...
- 关于人人开源renren-fast-vue 中npm install各种报错的解决方案
首先吐槽一下,因为这个问题我整了好几天,把报错信息复制百度,试遍了各种方法,node.js我是卸载了安装,安装了卸载,甚至renren-fast-vue我也删了再下,然后再删,无限循环.然而没有什么软 ...
- js计算两个时间相差
.filter('useTime', function() { return function(val) { // if (/.(.mp4)$/gi.test(url)) { // return JS ...
- spring @value和@@PropertySource注解简单使用
@Value注解:可以使用注入基本字符串 EL表达式,从配置文件读取数据@PropertySource用于引入单个配置文件 @PropertySources用于引入多个配置文件 @PropertySo ...
- 【SCOI2016】背单词
P3294[SCOI2016]背单词 [提示] 这道题大概是告诉我们,让我们用一堆n个单词安排顺序,如果当前位置为x,当前单词的后缀没在这堆单词出现过,代价就为x,这里的后缀是原意,但不算自己(不算本 ...
- Java知识系统回顾整理01基础03变量08表达式
一.以 ; 结尾的一段代码,即为一个表达式 表达式是由变量.操作符以及方法调用所构成的结构.如下所示: int i = 5; System.out.println(5); 都是表达式 public c ...
- Arduino 多线程简单代码
转载: 1. https://www.csdn.net/gather_27/MtTaggzsMDExMS1ibG9n.html 2. https://v.youku.com/v_show/id ...
- 南方IT比赛项目
注意: 出现以下提示点击否就可以了 导入工作台: 导入模型 安装 安装到工作台上 修改模型位置 更新工具位置 点击是 改角度 九十度 添加组件 改一下名字,方便记忆 把工具移到组件 拆除后将工具移到S ...
- CentOS 7 系统的安装
1.进入安装界面 2.选择"Install CentOS 7" 3.进入欢迎界面,默认语言为"English",点击"Continue" 进 ...