上一篇讲到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相关推荐

  1. JUC多线程:synchronized锁机制原理 与 Lock锁机制

    前言: 线程安全是并发编程中的重要关注点,造成线程安全问题的主要原因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据.因此为了解决这个问题,我们可能需要这样一个方案,当存在多 ...

  2. Python多线程——LOCK锁

    ''' import threading number=0 def addNumber():global numberfor i in range(1000000):number+=1# 运行时分为计 ...

  3. Java之多线程里面的锁理解以及synchronized与Lock的区别

    一.宏观的说下锁的分类 1)锁分为乐观锁.悲观锁 悲观锁认为对于同一个数据的并发操作,一定是会发生修改的,哪怕没有修改,也会认为修改.因此对于同一个数据的并发操作,悲观锁采取加锁的形式.悲观的认为,不 ...

  4. Java多线程知识点整理(Lock锁)

    2019独角兽企业重金招聘Python工程师标准>>> 1.Lock的使用 private Lock lock = new ReentrantLock();public void t ...

  5. 多线程和线程安全 同步代码 lock锁

     多线程:Thread Runnable 并发与并行 •并发:指两个或多个事件在同一个时间段内发生. •并行:指两个或多个事件在同一时刻发生(同时发生). 线程 是程序中的执行线程.Java 虚拟机允 ...

  6. 12【多线程、锁机制、lock锁】

    上一篇:11[泛型.Map.异常] 下一篇:13[线程等待.状态.线程池.File类] 目录:[JavaSE零基础系列教程目录] 12[多线程.锁机制.lock锁] 一.多线程概念 在实际应用中,多线 ...

  7. 多线程的三种实现方法、线程类的常见方法、线程安全问题:synchronized和Lock锁、生产者和消费者问题

    1. 多线程的三种实现方式 1.1 继承Thread类 实现步骤: 定义一个类MyThread继承Thread类 在MyThread类中重写run()方法 创建MyThread类的对象 启动线程sta ...

  8. 23.多线程(进程的概述和多进程的意义,线程的概述和多线程的意义,JVM运行原理以及JVM启动的线程探讨,实现多线程 线程调度,线程控制,Lock锁,死锁现象)

    1.进程概述及多进程的意义 1.线程和进程     要想说线程,首先必须得聊聊进程,因为线程是依赖于进程存在的. 2.进程概述     什么是进程呢?通过任务管理器我们就可以看到进程的存在.      ...

  9. java 多线程 串行 加锁_java多线程 synchronized 与lock锁 实现线程安全

    如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样 的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 通过卖火车票的例子 火车站要卖票,我们 ...

  10. java多线程安全解决方案_java常用知识:多线程安全问题的解决方法-Lock锁

    jdk1.5后出现的 两个方法: void Lock() void unlock() 使用步骤: 1.在成员位置创建一个ReentrantLock对象 2.在可能出现安全问题的代码前调用Lock接口中 ...

最新文章

  1. Linux软件安装配置Yum源
  2. 【VS开发】模态对话框和非模态对话框
  3. 一个简单的小技巧,监控网页所有动态标签创建的调用处
  4. 安卓APP_ 控件(3)—— EditText
  5. 刚刚,阿里云上线六大“战疫情”项目
  6. Spring MVC处理用户请求的完整流程
  7. C++---内存泄漏与防范
  8. 读书笔记:《领导变革》
  9. 软件是怎么开发出来的?怎么进行软件开发流程
  10. Excel做数据海报
  11. JTAG的TAP状态机介绍
  12. JAVA版微信支付V3—JSAPI支付
  13. plsql 客户端字符集_plsql查看数据库字符集
  14. hadoop103 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password)
  15. 杜亚楠: 用微组织技术撬动细胞培养大变革
  16. 2012年CSDN高校俱乐部秋季巡讲结案报告
  17. 虹科案例|安全性防护平台-海康威视摄像机中的重大漏洞
  18. 一、Android Matrix 矩阵
  19. QNX独特的工程目录结构
  20. 1元秒杀,1小时145人购买,高达1分钟2人+购买,有人错过了,要求追加1元秒杀...

热门文章

  1. 【Oracle学习笔记】索引
  2. CYQ.Data 轻量数据访问层(七) 自定义数据表实现绑定常用的数据控件(上)
  3. 学习几个Excel表格职场实战技巧
  4. 问答网站系统Question2Answer评测
  5. 悟透LoadRunner - 调用外部DLL的点点滴滴
  6. COM 组件设计与应用7 - 编译、注册、调用
  7. 多特征线性回归梯度下降算法的matlab实现
  8. BZOJ2199[Usaco2011 Jan] 奶牛议会
  9. git学习笔记-(8-高层命令(2))
  10. 规范并优化Nginx配置文件