ReentrantReadWriteLock:

类ReentrantLock具有相互互斥的排他效果,也就是说,同一时间,只有一个线程执行lock()方法后面的任务。这样做虽然可以解决问题,但是效率非常低。使用ReentrantReadWriterLock可以加快运行效率,某些不需要操作实例变量的方法中,完全可以使用它来提升代码运行效率。
为什么不需要操作实例变量变量方法才可以用它来提升效率呢?
  • (1),读读不互斥
  • (2),读写互斥
  • (3),写读互斥
  • (4),写写互斥

读读不互斥:

import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
* @ClassName ReentrantReadWriteLockRRExample
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/25.
*/
public class ReentrantReadWriteLockRRExample {
public static void main(String[] args) {
ReentrantReadWriteLock rWlock = new ReentrantReadWriteLock();
Runnable r = () ->{
rWlock.readLock().lock();
try {
System.out.println("当前时间戳:" + System.currentTimeMillis());
Thread.sleep(1000);
System.out.println("当前时间戳:" + System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
rWlock.readLock().unlock();
}
};
Thread t1 = new Thread(r,"t1");
Thread t2 = new Thread(r,"t2");
t1.start();
t2.start();
}
}

 读写互斥:

import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
* @ClassName ReentrantReadWriteLockRW
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/25.
*/
public class ReentrantReadWriteLockRW {
public static void main(String[] args) {
ReentrantReadWriteLock rWLock = new ReentrantReadWriteLock(true);
Runnable rr = () -> {
String tName = Thread.currentThread().getName();
rWLock.readLock().lock();
System.out.println(tName + "开始读...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
System.out.println(tName + "读完了!");
rWLock.readLock().unlock();
}
};
Runnable rw = () -> {
String tName = Thread.currentThread().getName();
rWLock.writeLock().lock();
System.out.println(tName + "开始写...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
System.out.println(tName + "写完了!");
rWLock.writeLock().unlock();
}
};
Thread reader = new Thread(rr,"读者1");
Thread reader1 = new Thread(rr,"读者2");
Thread writer = new Thread(rw,"作家1");
Thread writer1 = new Thread(rw,"作家2");
reader.start();
reader1.start();
writer.start();
writer1.start();
}
}

 

java 多线程 读写互斥锁ReentrantReadWriteLock:读读不互斥,读写互斥,写写互斥的更多相关文章

  1. Java多线程系列--“JUC锁”08之 共享锁和ReentrantReadWriteLock

    概要 Java的JUC(java.util.concurrent)包中的锁包括"独占锁"和"共享锁".在“Java多线程系列--“JUC锁”02之 互斥锁Ree ...

  2. Java多线程系列--“JUC锁”02之 互斥锁ReentrantLock

    本章对ReentrantLock包进行基本介绍,这一章主要对ReentrantLock进行概括性的介绍,内容包括:ReentrantLock介绍ReentrantLock函数列表ReentrantLo ...

  3. Java多线程系列--“JUC锁”03之 公平锁(一)

    概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...

  4. Java多线程系列--“JUC锁”04之 公平锁(二)

    概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...

  5. Java多线程系列--“JUC锁”10之 CyclicBarrier原理和示例

    概要 本章介绍JUC包中的CyclicBarrier锁.内容包括:CyclicBarrier简介CyclicBarrier数据结构CyclicBarrier源码分析(基于JDK1.7.0_40)Cyc ...

  6. Java多线程系列--“JUC锁”01之 框架

    本章,我们介绍锁的架构:后面的章节将会对它们逐个进行分析介绍.目录如下:01. Java多线程系列--“JUC锁”01之 框架02. Java多线程系列--“JUC锁”02之 互斥锁Reentrant ...

  7. Java多线程系列--“JUC锁”09之 CountDownLatch原理和示例

    概要 前面对"独占锁"和"共享锁"有了个大致的了解:本章,我们对CountDownLatch进行学习.和ReadWriteLock.ReadLock一样,Cou ...

  8. Java多线程系列--“JUC锁”05之 非公平锁

    概要 前面两章分析了"公平锁的获取和释放机制",这一章开始对“非公平锁”的获取锁/释放锁的过程进行分析.内容包括:参考代码获取非公平锁(基于JDK1.7.0_40)释放非公平锁(基 ...

  9. Java多线程系列--“JUC锁”11之 Semaphore信号量的原理和示例

    概要 本章,我们对JUC包中的信号量Semaphore进行学习.内容包括:Semaphore简介Semaphore数据结构Semaphore源码分析(基于JDK1.7.0_40)Semaphore示例 ...

  10. Java多线程系列--“JUC锁”06之 Condition条件

    概要 前面对JUC包中的锁的原理进行了介绍,本章会JUC中对与锁经常配合使用的Condition进行介绍,内容包括:Condition介绍Condition函数列表Condition示例转载请注明出处 ...

随机推荐

  1. ss 显示socket状态

    ss ===show socket用于显示socket状态 所有的TCP sockets 所有的UDP sockets 所有ssh/ftp/ttp/https持久连接 所有连接到Xserver的本地进 ...

  2. R语言与医学统计图形-【13】ggplot2几何对象之盒形图

    ggplot2绘图系统--几何对象之盒形图 参数: geom_boxplot(mapping = , #lower,middle,upper,x,ymax,ymin必须(有默认) #alpha/col ...

  3. SQL-join(inner join)、left join、right join、full join

    0.JOIN 类型 有时我们需要从两个或更多的表中获取结果,数据库中的表可通过键将彼此联系起来.每个表中都有一个主键,主键(Primary Key)是一个列,值都唯一.这样做的目的是在不重复每个表中的 ...

  4. echarts中饼状图数据太多进行翻页

    echarts饼状图数据太多 echarts 饼状图内容太多怎么处理 有些时候,我们饼状图中echarts的数据可能会很多. 这个时候展示肯定会密密麻麻的.导致显示很凌乱 我们需要'翻页'类似表格展示 ...

  5. 给lua_close实现回调函数

    先讲下为什么会需要lua_close回调吧. 我用C++给lua写过不少库,其中有一些,是C++依赖堆内存,并且是每一个lua对象使用一块单独的内存来使用的. 在之前,我一直都是魔改lua源代码,给l ...

  6. javaWeb - 3 — JSP (技术已淘汰)— 更新完毕

    1.jsp 在servlet中说过java中前端到后台有两条路线嘛 后台 <------ ajax.json <--------- 前端 后台 <------ jsp( EL.JST ...

  7. adhere, adjust, adjacent

    adhere to stick,不是to here. 在古英语里,stick是twig(细树枝).fasten(想必是用twig来固定).后引申为粘住.stick还有stab, pierce的意思,想 ...

  8. Angular 中 [ngClass]、[ngStyle] 的使用

    1.ngStyle 基本用法 1 <div [ngStyle]="{'background-color':'green'}"></<div> 判断添加 ...

  9. 【Linux】【Commands】trouble shooting命令详解目录

    1. 简介 1.1. 最近看到阿里的运维招聘需要熟练掌握以下的命令,我就针对这几个命令做一下总结,有些命令我觉得别人总结的挺好了,我就不赘述了 1.2. 还有一些其他我觉得用得到的命令的用法会在第三部 ...

  10. Java_zip_多源文件压缩到指定目录下

    依赖: <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-compress --> <depend ...