多线程的Lock锁——ReentrantReadWriteLock
上一篇讲到ReentrantLock是排他性,一方面保证了线程的绝对安全,但另一方面降低了效率。对于一些不需要操作实例变量的方法中,有另外一种锁可以提高运行效率,这种锁就是ReadWriteReentrantLock。
ReentrantReadWriteLock,也称为读写锁。读写锁有两个锁,一个是读操作相关的锁,也叫共享锁;另一个是写操作相关锁,也叫排他锁。
读锁之间不互斥,写锁之间互斥,读写锁之间互斥。
使用
private ReadWriteLock lock = new ReentrantReadWriteLock();lock.readLock().lock(); . . . lock.readLock().unlock();lock.writeLock().lock(); . . . lock.writeLock().unlock();
举个具体例子:
1、创建服务类
package com.cjs.ReadWriteLock_3;import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock;public class Service {private ReadWriteLock lock = new ReentrantReadWriteLock();public void read() {try {try {lock.readLock().lock();System.out.println("获得读锁:" + Thread.currentThread().getName() + " " + System.currentTimeMillis());Thread.sleep(3000);} finally {lock.readLock().unlock();}} catch (Exception e) {e.printStackTrace();}}public void write() {try {try {lock.writeLock().lock();System.out.println("获得写锁:" + Thread.currentThread().getName() + " " + System.currentTimeMillis());Thread.sleep(3000);} finally {lock.writeLock().unlock();}} catch (Exception e) {e.printStackTrace();}} }
2、创建两个线程类,
package com.cjs.ReadWriteLock_3;public class ReadThread extends Thread {private Service service;@Overridepublic void run() {service.read();}public ReadThread(Service service) {this.service = service;} }
package com.cjs.ReadWriteLock_3;public class WriteThread extends Thread {private Service service;public WriteThread(Service service) {this.service = service;}@Overridepublic void run() {service.write();} }
3、创建一个Main类,
package com.cjs.ReadWriteLock_3;public class Run {public static void main(String[] args) {Service service = new Service();ReadThread[] readThreads = new ReadThread[10];WriteThread[] writeThreads = new WriteThread[10];for (int i = 0; i < 10; i++) {readThreads[i] = new ReadThread(service);readThreads[i].setName("ReadThread" + (i + 1));readThreads[i].start();writeThreads[i] = new WriteThread(service);writeThreads[i].setName("WriteThread" + (i + 1));writeThreads[i].start();}} }
4、运行程序,
注意框框的两条记录,上面提及的读写锁之间的两两特性,只有当当前持有写锁时,其他线程才会进入阻塞状态,如果是持有读锁,那么还是会有可能另一个线程获得读锁。
转载于:https://www.cnblogs.com/SysoCjs/p/10319520.html
多线程的Lock锁——ReentrantReadWriteLock相关推荐
- JUC多线程:synchronized锁机制原理 与 Lock锁机制
前言: 线程安全是并发编程中的重要关注点,造成线程安全问题的主要原因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据.因此为了解决这个问题,我们可能需要这样一个方案,当存在多 ...
- Python多线程——LOCK锁
''' import threading number=0 def addNumber():global numberfor i in range(1000000):number+=1# 运行时分为计 ...
- Java之多线程里面的锁理解以及synchronized与Lock的区别
一.宏观的说下锁的分类 1)锁分为乐观锁.悲观锁 悲观锁认为对于同一个数据的并发操作,一定是会发生修改的,哪怕没有修改,也会认为修改.因此对于同一个数据的并发操作,悲观锁采取加锁的形式.悲观的认为,不 ...
- Java多线程知识点整理(Lock锁)
2019独角兽企业重金招聘Python工程师标准>>> 1.Lock的使用 private Lock lock = new ReentrantLock();public void t ...
- 多线程和线程安全 同步代码 lock锁
多线程:Thread Runnable 并发与并行 •并发:指两个或多个事件在同一个时间段内发生. •并行:指两个或多个事件在同一时刻发生(同时发生). 线程 是程序中的执行线程.Java 虚拟机允 ...
- 12【多线程、锁机制、lock锁】
上一篇:11[泛型.Map.异常] 下一篇:13[线程等待.状态.线程池.File类] 目录:[JavaSE零基础系列教程目录] 12[多线程.锁机制.lock锁] 一.多线程概念 在实际应用中,多线 ...
- 多线程的三种实现方法、线程类的常见方法、线程安全问题:synchronized和Lock锁、生产者和消费者问题
1. 多线程的三种实现方式 1.1 继承Thread类 实现步骤: 定义一个类MyThread继承Thread类 在MyThread类中重写run()方法 创建MyThread类的对象 启动线程sta ...
- 23.多线程(进程的概述和多进程的意义,线程的概述和多线程的意义,JVM运行原理以及JVM启动的线程探讨,实现多线程 线程调度,线程控制,Lock锁,死锁现象)
1.进程概述及多进程的意义 1.线程和进程 要想说线程,首先必须得聊聊进程,因为线程是依赖于进程存在的. 2.进程概述 什么是进程呢?通过任务管理器我们就可以看到进程的存在. ...
- java 多线程 串行 加锁_java多线程 synchronized 与lock锁 实现线程安全
如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样 的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 通过卖火车票的例子 火车站要卖票,我们 ...
- java多线程安全解决方案_java常用知识:多线程安全问题的解决方法-Lock锁
jdk1.5后出现的 两个方法: void Lock() void unlock() 使用步骤: 1.在成员位置创建一个ReentrantLock对象 2.在可能出现安全问题的代码前调用Lock接口中 ...
最新文章
- Linux软件安装配置Yum源
- 【VS开发】模态对话框和非模态对话框
- 一个简单的小技巧,监控网页所有动态标签创建的调用处
- 安卓APP_ 控件(3)—— EditText
- 刚刚,阿里云上线六大“战疫情”项目
- Spring MVC处理用户请求的完整流程
- C++---内存泄漏与防范
- 读书笔记:《领导变革》
- 软件是怎么开发出来的?怎么进行软件开发流程
- Excel做数据海报
- JTAG的TAP状态机介绍
- JAVA版微信支付V3—JSAPI支付
- plsql 客户端字符集_plsql查看数据库字符集
- hadoop103 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password)
- 杜亚楠: 用微组织技术撬动细胞培养大变革
- 2012年CSDN高校俱乐部秋季巡讲结案报告
- 虹科案例|安全性防护平台-海康威视摄像机中的重大漏洞
- 一、Android Matrix 矩阵
- QNX独特的工程目录结构
- 1元秒杀,1小时145人购买,高达1分钟2人+购买,有人错过了,要求追加1元秒杀...