有时候我们需要有这样的需求:
        对于同一个文件进行读和写操作,普通的锁是互斥的,这样读的时候会加锁,只能单线程的读,我们希望多线程的进行读操作,并且读的时候不能进行写操作,写的时候不能进行读操作,也就是:“读读不互斥”,“读写互斥”,“写写互斥”这个时候就需要用的jdk听的“读写锁了。
ReentrantReadWriteLock:读写锁,分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,写锁与写锁互斥,由JVM控制。

测试代码如下:

import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
* 读写锁
* "写写"和“读写”都是互斥
* “读读”不需要互斥
* Created by gan on 2019/5/19 16:53.
*/
public class ReadWriteLockDemo { private static int number = 0; //初始化读写锁
private static ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); public static void main(String[] args) { new Thread(() -> {
//用100个线程去读
for (Integer i = 0; i < 100; i++) {
final int j = i;
new Thread(() -> {
read();
}, i.toString()).start(); } }).start(); new Thread(() -> {
//用100个线程去写
for (Integer i = 0; i < 100; i++) {
final int j = i;
new Thread(() -> {
write(j);
}, i.toString()).start(); }
}).start(); } /**
* 读方法
*/
public static void read() {
lock.readLock().lock(); //获取读锁
try {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + "读读读-----" + number);
}
} catch (Exception e) {
} finally {
lock.readLock().unlock(); //finally块里面释放读锁
} } public static void write(int num) {
lock.writeLock().lock(); //获取写锁
try {
number = num;
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + "写写写++++++" + number);
}
} catch (Exception e) {
} finally {
lock.writeLock().unlock(); //finally块里面释放写锁
} } }

我们期望的结果是在读线程操作方法read()打印时候是“乱序的”,也就是其他读线程也会交替的打印读操作。  但是当写线程操作方法write()执行的时候必须是等待这个方法打印完毕,其他读或者写线程才能执行,也就是说些write()方法进行打印的时候必须是当前一个写线程连续的打印完毕,中间不会被其他读或者写线程打断。 运行结果如下:

Java多线程编程之读写锁【ReentrantReadWriteLock】的更多相关文章

  1. Java多线程13:读写锁和两种同步方式的对比

    读写锁ReentrantReadWriteLock概述 大型网站中很重要的一块内容就是数据的读写,ReentrantLock虽然具有完全互斥排他的效果(即同一时间只有一个线程正在执行lock后面的任务 ...

  2. java 可重入读写锁 ReentrantReadWriteLock 详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt206 读写锁 ReadWriteLock读写锁维护了一对相关的锁,一个用于只 ...

  3. Java并发编程之读写锁

    读写锁维护了一对相关的锁,一个用于只读操作,一个用于写入操作.只要没有writer,读取锁可以由多个reader线程同时保持.写入锁是独占的. 可重入读写锁 ReentrantReadWriteLoc ...

  4. 多线程之使用读写锁ReentrantReadWriteLock实现缓存系统

    简单地缓存系统:当有线程来取数据时.假设该数据存在我的内存中.我就返回数据.假设不存在我的缓存系统中,那么就去查数据库.返回数据的同一时候保存在我的缓存中. 当中涉及到读写问题:当多个线程运行读操作时 ...

  5. 多线程编程_读写锁ReadWriteLock

    Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也应该是一个对象.两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象. 读写锁:分为读 ...

  6. java多线程设计模式(3)读写锁模式

    1 Read-Write Lock Pattern Read-Write Lock Pattern是一种将对于共享资源的访问与修改操作分离,称为读写分离.即访问是reader,修改是write,用单独 ...

  7. 轻松掌握java读写锁(ReentrantReadWriteLock)的实现原理

    转载:https://blog.csdn.net/yanyan19880509/article/details/52435135 前言 前面介绍了java中排它锁,共享锁的底层实现机制,本篇再进一步, ...

  8. Java并发指南10:Java 读写锁 ReentrantReadWriteLock 源码分析

    Java 读写锁 ReentrantReadWriteLock 源码分析 转自:https://www.javadoop.com/post/reentrant-read-write-lock#toc5 ...

  9. [图解Java]读写锁ReentrantReadWriteLock

    图解ReentrantReadWriteLock 如果之前使用过读写锁, 那么可以直接看本篇文章. 如果之前未使用过, 那么请配合我的另一篇文章一起看:[源码分析]读写锁ReentrantReadWr ...

随机推荐

  1. 微信小程序 movable-view组件应用:可拖动悬浮框_返回首页

    1. movable-view组件具体内容可参考官网:微信官方文档 2. demo参考:https://github.com/ChinaFanny/YFWeappMovableView 运行效果 核心 ...

  2. hbase 由于zookeeper问题导致连接失败问题

    问题现象: 使用hbase shell 连接报如下问题: 2019-10-09 10:37:18,855 ERROR [main] zookeeper.RecoverableZooKeeper: Zo ...

  3. 2019SDN第7次上机作业

    2019SDN第7次上机作业 1.作业要求: 作业博客链接:https://edu.cnblogs.com/campus/fzu/fzusdn2019/homework/10165 2.具体操作步骤与 ...

  4. Monkey框架(测试方法篇) - monkey测试实例

    一.常规的稳定性测试 测试背景: 这是一个海外的合作项目,被测程序是Android应用(App).测试希望通过Monkey来模拟用户长时间的随机操作,检查被测应用是否会出现异常(应用崩溃或者无响应). ...

  5. 项目启动tomcat失败的几种可能原因和解决方法

    传送门:https://blog.csdn.net/u010565910/article/details/80411468 总结一下tomcat启动问题,也给自己做个笔记 , 逐渐补充完善. 1.ja ...

  6. Predicting effects of noncoding variants with deep learning–based sequence model | 基于深度学习的序列模型预测非编码区变异的影响

    Predicting effects of noncoding variants with deep learning–based sequence model PDF Interpreting no ...

  7. Java 动态调试技术原理及实践 【基本功】Java动态追踪技术探究

    https://mp.weixin.qq.com/s/ZlNcvwJ_swspifWTLHA92Q https://mp.weixin.qq.com/s/_hSaI5yMvPTWxvFgl-UItA

  8. Xamarin图表开发基础教程(7)OxyPlot框架

    Xamarin图表开发基础教程(7)OxyPlot框架 Xamarin.Forms中使用OxyPlot框架 在Xamarin. Forms平台上实现图表显示需要完成以下的步骤: 1.添加OxyPlot ...

  9. Cucumber介绍

    Cucumber是一个提供能让我们都理解的普通语言,通过普通语言来描述的测试用例,并支持行为驱动开发的测试工具.Cucumber支持大多数变成语言,如Ruby.Java和Python等. 官方地址:h ...

  10. PAT 甲级 1076 Forwards on Weibo (30分)(bfs较简单)

    1076 Forwards on Weibo (30分)   Weibo is known as the Chinese version of Twitter. One user on Weibo m ...