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的更多相关文章

  1. JUC(二):CAS及ABA

    CAS是什么? 比较并交换. CAS示例 package com.chinda.java.audition; import java.util.concurrent.atomic.AtomicInte ...

  2. AQS系列(四)- ReentrantReadWriteLock读写锁的释放锁

    前言 继续JUC包中ReentrantReadWriteLock的学习,今天学习释放锁. 一.写锁释放锁 入口方法 public void unlock() { sync.release(1); } ...

  3. JUC回顾之-AQS同步器的实现原理

    1.什么是AQS? AQS的核心思想是基于volatile int state这样的volatile变量,配合Unsafe工具对其原子性的操作来实现对当前锁状态进行修改.同步器内部依赖一个FIFO的双 ...

  4. 你知道什么是JUC了吗?

    多线程一直Java开发中的难点,也是面试中的常客,趁着还有时间,打算巩固一下JUC方面知识,我想机会随处可见,但始终都是留给有准备的人的,希望我们都能加油!!! 沉下去,再浮上来,我想我们会变的不一样 ...

  5. 最强Java并发编程详解:知识点梳理,BAT面试题等

    本文原创更多内容可以参考: Java 全栈知识体系.如需转载请说明原处. 知识体系系统性梳理 Java 并发之基础 A. Java进阶 - Java 并发之基础:首先全局的了解并发的知识体系,同时了解 ...

  6. Java锁_读写锁

    独占锁:是指锁一次只能被一个线程持有,ReentrantLock和Synchronized都是独占锁. 共享锁:是指锁可以被多个线程持有. 对于ReentrantReadWriteLock,其读锁是共 ...

  7. Java多线程系列--“JUC锁”08之 共享锁和ReentrantReadWriteLock

    概要 Java的JUC(java.util.concurrent)包中的锁包括"独占锁"和"共享锁".在“Java多线程系列--“JUC锁”02之 互斥锁Ree ...

  8. Java - "JUC" ReentrantReadWriteLock

    Java多线程系列--“JUC锁”08之 共享锁和ReentrantReadWriteLock ReadWriteLock 和 ReentrantReadWriteLock介绍 ReadWriteLo ...

  9. 6.JUC之ReentrantReadWriteLock

    一.概述: Java纪年1.5年,ReentrantReadWriteLock诞生于JUC,此后,国人一般称它为读写锁.人如其名,他就是一个可重入锁,同时他还是一个读写锁 a)跟ReentrantLo ...

随机推荐

  1. synchronized 锁的升级

    synchronized 的基本认识 在多线程并发编程中 synchronized 一直是元老级角色,很 多人都会称呼它为重量级锁.但是,随着 Java SE 1.6 对 synchronized 进 ...

  2. 1.变量:var,let,const

    var在ECMAScript的所有版本中都可以使用,而const和let只能在ES6及更晚的版本中使用. var,let,const三个关键字的区别 var: 1)声明作用域:在函数内部,使用var定 ...

  3. 实验 4:Open vSwitch 实验——Mininet 中使用 OVS 命令

    一.安装目的 Mininet 安装之后,会连带安装 Open vSwitch,可以直接通过 Python 脚本调用Open vSwitch 命令,从而直接控制 Open vSwitch,通过实验了解调 ...

  4. 00 你的第一个C语言程序

    C语言简介 C 语言是一种通用的.面向过程式的计算机程序设计语言,即编程语言. 为移植和开发 UNIX 操作系统,丹尼斯·里奇于1972年在贝尔电话实验室设计开发了 C 语言的第一个版本. C 语言同 ...

  5. P5322 排兵布阵解题报告

    本想在洛谷上交篇题解的,结果发现交不了,所以只能在这边写了... 作为一个蒟蒻,看到省选题,第一眼考虑怎么打暴力 我们可以分情况考虑 当\(s==1\)的时候 我们可以把他当成一个\(01\)背包,背 ...

  6. centos7下安装fabric2.2

    准备基础环境 1.安装curl.git yum install curl yum install git 2.go环境搭建 下载解压 cd /home mkdir app cd app wget ht ...

  7. XML节点自动生成简单实例

    有些时候我们在拼装XML的过程中,因为各种拼接会感到非常的麻烦(定义变量模型,自动生成,使用XElement再去组装),我的脑袋感觉都大了,能不能有个稍微比较快捷自动随变量自动生成XML格式的方式,看 ...

  8. spring-boot-route(十三)整合RabbitMQ

    这篇是SpringBoot整合消息队列的第一篇文章,我们详细介绍下消息队列的相关内容. 消息队列简介 1. 什么是消息队列 MQ(Message Quene):通过典型的生产者和消费者模型,生产者不断 ...

  9. vue点击切换样式,点击切换地址栏,点击显示或者隐藏

    1. vue点击显示切换 :class='{"span":index==0}' class原本是 类选择器 加上 :class就是绑定属性的意思 '{"span" ...

  10. Java源码详解系列(十一)--Spring的使用和源码

    Spring 是一个一站式的 Java 框架,致力于提高我们项目开发的效率.通过 Spring,我们可以避免编写大量额外代码,更专注于我们的核心逻辑.目前,Spring 已经成为最受欢迎的 Java ...