JUC-ReadWriteLock
ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有 writer,读取锁可以由多个 reader 线程同时保持。写入锁是独占的。
ReadWriteLock 读取操作通常不会改变共享资源,但执行写入操作时,必须独占方式来获取锁。
对于读取操作占多数的数据结构。ReadWriteLock 能提供比独占锁更高的并发性。
而对于只读的数据结构,其中包含的不变性可以完全不需要考虑加锁操作。
ReadWriteLock实际上是一种乐观锁。
对于一个线程来说,读取数据不需要线程安全,写数据需要线程安全。因此如果读操作也只能一次只有一个线程操作,那么性能就浪费了,为此有了读写锁。
正常的锁,一次只能有一个线程操作。
读写锁:分为读锁和写锁。
读锁:可以多个读线程并发持有,一次能够有n多线程同时执行。
写锁:跟普通锁一样,是独占的,一次只能有一个线程进行写操作。
这样可以提高并发效率。
使用场景:
- 写写/读写 操作:需要互斥。
- 读读操作:不需要互斥。
初始化:
ReadWriteLock lock = new ReentrantReadWriteLock();
读锁上锁:
lock.readLock().lock(); //上锁
写锁上锁:
lock.writeLock().lock();
代码:
package com.atguigu.juc;import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock;/** 1. ReadWriteLock : 读写锁* * 写写/读写 需要“互斥”* 读读 不需要互斥*/ public class TestReadWriteLock {public static void main(String[] args) {ReadWriteLockDemo rw = new ReadWriteLockDemo();new Thread(new Runnable() {@Overridepublic void run() {rw.set((int)(Math.random() * 101));}}, "Write:").start();for (int i = 0; i < 100; i++) {new Thread(new Runnable() {@Overridepublic void run() {rw.get();}}).start();}} }class ReadWriteLockDemo{private int number = 0;private ReadWriteLock lock = new ReentrantReadWriteLock();//读public void get(){lock.readLock().lock(); //上锁try{System.out.println(Thread.currentThread().getName() + " : " + number);}finally{lock.readLock().unlock(); //释放锁 }}//写public void set(int number){lock.writeLock().lock();try{System.out.println(Thread.currentThread().getName());this.number = number;}finally{lock.writeLock().unlock();}} }
JUC-ReadWriteLock相关推荐
- JUC系列(八)| 读写锁-ReadWriteLock
多线程一直Java开发中的难点,也是面试中的常客,趁着还有时间,打算巩固一下JUC方面知识,我想机会随处可见,但始终都是留给有准备的人的,希望我们都能加油!!! 沉下去,再浮上来,我想我们会变的不一样 ...
- 多线程与高并发(三):JUC包下新的同步机制:CAS,AtomicInteger,AtomicLong,ReentrantLock,CountDownLatch,ReadWriteLock等
CAS CAS 是一种乐观锁,syncronized 是一种悲观锁 AtomicInteger AtomicInteger count = new AtomicInteger(0); /*synchr ...
- 面试高频——JUC并发工具包快速上手(超详细总结)
目录 一.什么是JUC 二.基本知识 2.1.进程和线程 2.2.Java默认有两个进程 2.3.Java能够开启线程吗? 2.4.并发和并行 2.5.线程的状态 2.6.wait和sleep的区别 ...
- juc java_深入理解JUC(java.util.concurrent)
Concurrent下的核心类 Executor:具有runnable任务的执行者 ExecutorService:一个线程池管理者,实现类有多种,能把runnable,callable提交到线程池中 ...
- 多线程总结-JUC中常用的工具类
本文只记录JUC中较常用到的一些工具类,只是列举其常见的使用方法,至于其实现原理,此处不做说明. CountDownLatch 一个同步工具类,允许一个或多个线程一直等待,直到其他线程运行完成后再执行 ...
- 多线程基础与JUC进阶笔记
文章目录 1.实现线程的几种方式 1.1.继承Thread类 1.2.实现Runnable接口 1.3.实现Callable接口 2.Lambda表达式 3.静态代理模式 4.synchronized ...
- JUC多线程:synchronized锁机制原理 与 Lock锁机制
前言: 线程安全是并发编程中的重要关注点,造成线程安全问题的主要原因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据.因此为了解决这个问题,我们可能需要这样一个方案,当存在多 ...
- JUC学习笔记及拓展
Java JUC 1 Java JUC简介 在 Java 5.0 提供了 java.util.concurrent (简称 JUC )包,在此包中增加了在并发编程中很常用 的实用工具类,用于定义类似于 ...
- Java并发编程—JUC的Lock锁
一.Lock (JUC锁) JUC 锁位于java.util.concurrent.locks包下,为锁和等待条件提供一个框架,它不同于内置同步和监视器. CountDownLatch,CyclicB ...
- 浅谈Java锁,与JUC的常用类,集合安全类,常用辅助类,读写锁,阻塞队列,线程池,ForkJoin,volatile,单例模式不安全,CAS,各种锁
浅谈JUC的常用类 JUC就是java.util.concurrent-包下的类 回顾多线程 Java默认有几个线程? 2 个 mian.GC Java 真的可以开启线程吗? 开不了,点击源码得知:本 ...
最新文章
- ubuntu16.04:成功解决ubuntu16.04 忘记root密码
- 企业SAP的二次开发管理之路
- 基于模块度的社团检测算法
- 大家一起做训练 第一场 A Next Test
- Microsoft Project学习系列(一)
- Qt编程之对QGraphicsItem点击右键弹出菜单
- RocketMQ类关系图之broker/store
- 【正点原子STM32连载】第一章 本书学习方法 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
- 最新大数据资料合集.pdf
- 教程 参数设置_AI全自动剪辑软件安装教程,参数设置与使用注意事项
- 追逐自己的梦想----------辅助制作第二十四课:寻路call的分析
- 用 SpriteKit 做一个逃逸游戏 (2)
- Python制作微信小助手
- 《在职报考英语四六级须知》
- git 版本回退之关于git reset --hard 和 --soft区别
- python 图像格式转换文件夹下 jpg 转 bmp | 目录遍历
- 面试官常问的问题及回答
- Windows无法访问网络共享解决办法
- windows10 原版 纯净版 下载
- 网站建设基础-使用if和switch分别输出今天为周几
热门文章
- 算术运算符举例java_Java的算术运算符简介
- python在通信中的应用_基于Redis的进程间通信——在C++里使用python的深度学习模型...
- QuickLook搭配Everthing提高工作效率
- excel根据rgb自动填充颜色_Excel一键定位空值与自动填充
- 牛客java面试题总结版(三)
- 高考后家有学计算机,2021高考热门专业将有大改动,计算机专业永远的神,榜首才是真黑马...
- html js 添加数据类型,js数据类型判断和转换
- linux格式化分区进程,linux磁盘分区格式化
- ios13文件连接服务器教程,iOS 13/iPad OS迈向生产力的一大步,SMB文件共享视频图文教程...
- Spark详解(九):Spark存储原理分析