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 ...
随机推荐
- 搭建Linux服务器
工欲善其事必先利其器, 虚拟机:百度云链接地址:https://pan.baidu.com/s/1_nWQh3WKF7xLs5-nmbZ8lA (Vmware 12 ) Linux 7:百度云链接 ...
- gRPC-Protocol语法指南
语法指南 (proto3) Defining A Message Type Scalar Value Types Default Values Enumerations Using Other Mes ...
- 深入了解Vue.js组件笔记
1.组件注册 Vue.component('name',{}) 创建的组件都是全局组件,它们在注册之后可以用在任何新创建的Vue根实例(new Vue)的模板中.第一个参数是组件的名字,第二个参数是一 ...
- Spring 的依赖注入应用代替工厂模式
接口 package FactoryExample; public interface Human { void eat(); void walk(); void show(); } 实现 实现一 p ...
- matlab中axis的用法
来源:https://ww2.mathworks.cn/help/matlab/ref/axis.html?searchHighlight=axis&s_tid=doc_srchtitle a ...
- 机器学习算法——kNN(k-近邻算法)
算法概述 通过测量不同特征值之间的距离进行 [分类] 优点:精度高.对异常值不敏感.无数据输入假定. 缺点:计算复杂度高.空间复杂度高. 适用数据范围: 数值型 和 标称型 . 算法流程 数据 样本数 ...
- 浅谈Samsung Exynos4412处理器
转载于:http://www.cnblogs.com/android210/archive/2013/01/16/2862349.html Topic:浅谈Samsung Exynos4412处理器( ...
- HTML常用标签(下)
HTML常用标签(下) 1. 表格标签 1.1 语法 <table> <!--table定义表格--> <tr> <!--tr定义表格中的行--> &l ...
- Git之多人协同开发
一.获取远程库信息 1 2 3 $ git remote -v origin https://github.com/xxxxx/node.git (fetch) origin https://gi ...
- Python错误:AssertionError: group argument must be None for now
运行多线程出现的错误 调试了很久,最后发先 __init__ 写错了,修改后后,运行正确.