java并发初探ReentrantWriteReadLock

ReenWriteReadLock类的优秀博客

ReentrantReadWriteLock读写锁详解
Java多线程系列--“JUC锁”08之 共享锁和ReentrantReadWriteLock

ReentrantWriteReadLock类实现

@startuml
interface Lock
interface ReadWriteLock
class ReentrantReadWriteLock{
Sync sync
ReentrantReadWriteLock.ReadLock readerLock;
ReentrantReadWriteLock.WriteLock writerLock;
}
ReadWriteLock <|-- ReentrantReadWriteLock
ReentrantReadWriteLock --o ReadLock
ReentrantReadWriteLock --o WriteLock
ReentrantReadWriteLock --o Sync
AbstractQueuedSynchronizer <|- Sync
Lock <|-- ReadLock
Lock <|-- WriteLock
@enduml

特点

ReentrantWriteReadLock内部有读锁和写锁。
写锁是独占锁
当前线程持有写锁,其他线程只能等待
当其他线程拥有对象的写锁或者读锁,当前线程等待获取写锁
读锁是共享锁
没有其他线程的写锁,当前线程可以获取读锁

使用例子

package com.java.javabase.thread.base.concurrent.lock;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;@Slf4j
public class ReentranReadWriteLockTest {/*** @author* @version* @since*/public static void main(String[] args) {ReentranReadWriteLockTest test =new ReentranReadWriteLockTest();User user =test.new User("jack",test.new Count("001",1000));for(int i=0;i<3;i++){user.printCash();user.setCash(1000);}}@Data@AllArgsConstructor@NoArgsConstructorclass Count {private String id;private int cash;}@Dataclass User {private String name;private Count count;private ReadWriteLock readWriteLock;public User(String name, Count count) {this.name = name;this.count = count;this.readWriteLock = new ReentrantReadWriteLock();}public void setCash(final int cash) {new Thread() {@Overridepublic void run() {readWriteLock.writeLock().lock();try {log.info("thread {} :user {} set  cash {} start",Thread.currentThread().getName(), name, cash);Thread.sleep(1000);log.info("thread {} :user {} current  cash = {}",Thread.currentThread().getName(), name, count.getCash());count.setCash(cash);log.info("thread {} :user {} set  cash {} end",Thread.currentThread().getName(), name, cash);} catch (InterruptedException e) {e.printStackTrace();}finally {readWriteLock.writeLock().unlock();}}}.start();}public void printCash() {new Thread() {@Overridepublic void run() {try {readWriteLock.readLock().lock();log.info("thread {} :user {} get  cash start", Thread.currentThread().getName(), name);log.info("thread {} :user {} current  cash = {}",Thread.currentThread().getName(), name, count.getCash());Thread.sleep(1000);log.info("thread {} :user {} get  cash end", Thread.currentThread().getName(), name);} catch (InterruptedException e) {e.printStackTrace();} finally {readWriteLock.readLock().unlock();}}}.start();}}
}

例子结果

2019-08-09 10:49:15,618   [Thread-0] INFO  ReentranReadWriteLockTest  - thread Thread-0 :user jack get  cash start
2019-08-09 10:49:15,618   [Thread-0] INFO  ReentranReadWriteLockTest  - thread Thread-0 :user jack current  cash = 1000
2019-08-09 10:49:16,618   [Thread-0] INFO  ReentranReadWriteLockTest  - thread Thread-0 :user jack get  cash end
2019-08-09 10:49:16,618   [Thread-1] INFO  ReentranReadWriteLockTest  - thread Thread-1 :user jack set  cash 1000 start
2019-08-09 10:49:17,618   [Thread-1] INFO  ReentranReadWriteLockTest  - thread Thread-1 :user jack current  cash = 1000
2019-08-09 10:49:17,618   [Thread-1] INFO  ReentranReadWriteLockTest  - thread Thread-1 :user jack set  cash 1000 end
2019-08-09 10:49:17,618   [Thread-4] INFO  ReentranReadWriteLockTest  - thread Thread-4 :user jack get  cash start
2019-08-09 10:49:17,618   [Thread-2] INFO  ReentranReadWriteLockTest  - thread Thread-2 :user jack get  cash start
2019-08-09 10:49:17,618   [Thread-4] INFO  ReentranReadWriteLockTest  - thread Thread-4 :user jack current  cash = 1000
2019-08-09 10:49:17,618   [Thread-2] INFO  ReentranReadWriteLockTest  - thread Thread-2 :user jack current  cash = 1000
2019-08-09 10:49:18,618   [Thread-4] INFO  ReentranReadWriteLockTest  - thread Thread-4 :user jack get  cash end
2019-08-09 10:49:18,618   [Thread-2] INFO  ReentranReadWriteLockTest  - thread Thread-2 :user jack get  cash end
2019-08-09 10:49:18,618   [Thread-5] INFO  ReentranReadWriteLockTest  - thread Thread-5 :user jack set  cash 1000 start
2019-08-09 10:49:19,617   [Thread-5] INFO  ReentranReadWriteLockTest  - thread Thread-5 :user jack current  cash = 1000
2019-08-09 10:49:19,617   [Thread-5] INFO  ReentranReadWriteLockTest  - thread Thread-5 :user jack set  cash 1000 end
2019-08-09 10:49:19,617   [Thread-3] INFO  ReentranReadWriteLockTest  - thread Thread-3 :user jack set  cash 1000 start
2019-08-09 10:49:20,617   [Thread-3] INFO  ReentranReadWriteLockTest  - thread Thread-3 :user jack current  cash = 1000
2019-08-09 10:49:20,617   [Thread-3] INFO  ReentranReadWriteLockTest  - thread Thread-3 :user jack set  cash 1000 end

转载于:https://www.cnblogs.com/JuncaiF/p/11326190.html

java并发初探ReentrantWriteReadLock相关推荐

  1. java并发初探ConcurrentSkipListMap

    java并发初探ConcurrentSkipListMap ConcurrentSkipListMap以调表这种数据结构以空间换时间获得效率,通过volatile和CAS操作保证线程安全,而且它保证了 ...

  2. java并发初探ConcurrentHashMap

    java并发初探ConcurrentHashMap Doug Lea在java并发上创造了不可磨灭的功劳,ConcurrentHashMap体现这位大师的非凡能力. 1.8中ConcurrentHas ...

  3. java并发初探ThreadPoolExecutor拒绝策略

    java并发初探ThreadPoolExecutor拒绝策略 ThreadPoolExecuter构造器 corePoolSize是核心线程池,就是常驻线程池数量: maximumPoolSize是最 ...

  4. java并发初探CyclicBarrier

    java并发初探CyclicBarrier CyclicBarrier的作用 CyclicBarrier,"循环屏障"的作用就是一系列的线程等待直至达到屏障的"瓶颈点&q ...

  5. java并发初探CountDownLatch

    java并发初探CountDownLatch CountDownLatch是同步工具类能够允许一个或者多个线程等待直到其他线程完成操作. 当前前程A调用CountDownLatch的await方法进入 ...

  6. java并发:初探sleep方法

    sleep与wait sleep是Thread方法,使得当前线程从运行态变为阻塞态.但它不会释放对象的锁. wait方法是Object方法,它的作用是使得当前拥有对象锁的线程从运行态变为阻塞态, 它会 ...

  7. Java并发基础框架AbstractQueuedSynchronizer初探(ReentrantLock的实现分析)

    AbstractQueuedSynchronizer是实现Java并发类库的一个基础框架,Java中的各种锁(RenentrantLock, ReentrantReadWriteLock)以及同步工具 ...

  8. Java并发编程—常见面试题

    建议: 学习java并发前需要先掌握JVM知识 关于下面问题档案的详细解析都在后面推荐的相关系列文章中 一.线程安全相关 1.什么叫线程安全? 线程安全就是说多线程访问同一代码,不会产生不确定的结果. ...

  9. 怎么看java并发实战编程,22年最新

    10W字!阿里大牛力推的Java并发编程实战笔记,并发还难?阿里大牛力推的10W字Java并发编程实战笔记,有了这份笔记 并发还难?笔记总览:篇幅限制,在此就不全部展示了.想获取完整版Java并发编程 ...

最新文章

  1. Tomcat的安装和环境变量配置
  2. 创业公司做数据分析(三)用户行为数据采集系统 (转)
  3. 用StringBuilder 或StringBuffer: 把字符串“ABCDE”,转变成字符串“A,B,C,D” (注意,最后一个E是需要删除的)
  4. ​通俗理解神经网络BP反向传播算法
  5. 前端工程师应该掌握哪些技能才方便找工作?
  6. 第二阶段冲刺 每日站立会议 1/4
  7. 组合数字c语言do while,C语言初学do while语句(对输入数字字符,特殊符号等,进行统计).docx...
  8. linux 汇编语言ldreq,请教一个中断句柄的问题 - ARM技术论坛-ARM嵌入式论坛-人气最火爆ARM学习论坛 - 21ic电子技术开发论坛...
  9. 带你全面了解Http和Https(开发人员必备)
  10. Python实现Windows电脑定时关机
  11. paip.navicat form mysql导入文本文件时CPU占用100%的解决
  12. Chrome浏览器离线安装包下载方法
  13. SAI的操作与快捷键
  14. 互联网“围猎”老年人
  15. 转贴: 柴静 采访 张朝阳
  16. 显示网站Alexa世界排名的代码
  17. 各种路由器接口与连接方法
  18. AMiner会议论文推荐第三十二期
  19. 计算机科技英语写作,英语科技写作
  20. python计算器程序设计课程报告_20193120 2019-2020-2 《Python程序设计》实验二报告

热门文章

  1. c# xls 复制一行_编写干净的C#代码技巧
  2. C#巧妙实现服务器端应用程序和asp网页交互
  3. SpringCloud04 服务配置中心、消息总线、远程配置动态刷新
  4. 一些需要烂熟于心的代码
  5. HTML+CSS页面练习——legend第九部分
  6. 《高性能路由器 设计与实现》高性能路由器新型体系结构 小记
  7. Android 中像素px和dp的转化
  8. 初学JAVA——方法重载练习
  9. Linux——用户管理简单学习笔记(三)
  10. 设计模式六大原则你都知道吗?