在没有写操作的时候,两个线程同时读一个资源没有任何问题,允许多个线程同时读取共享资源。

但是如果有一个线程想去写这些共享资源,就不应该再有其它线程对该资源进行读或写。

简单来说,多个线程同时操作同一资源时,“读读共存,写写不共存,读写不共存”。

读写锁的锁定规则如下:
获得读锁后,其它线程可获得读锁而不能获取写锁
获得写锁后,其它线程既不能获得读锁也不能获得写锁

.

import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock; /**
* 读写锁。
*/
public class ReadWriteLockDemo { public static void main(String[] args) {
ReadWrite readWrite=new ReadWrite(); for(int i=0;i<5;i++) {
new Thread(new Runnable() {
@Override
public void run() {
readWrite.get();
}
}).start(); new Thread(new Runnable() {
@Override
public void run() {
readWrite.set();
}
}).start();
}
}
} class ReadWrite {
private ReadWriteLock readWriteLock=new ReentrantReadWriteLock(); /**
* 进行"读"操作
*/
public void get() {
try {
readWriteLock.readLock().lock();
System.out.println("线程"+Thread.currentThread().getName()+"进行读取。");
Thread.sleep(2*1000);
}catch (InterruptedException e) {
e.printStackTrace();
}finally {
readWriteLock.readLock().unlock();
System.out.println("线程"+Thread.currentThread().getName()+"读取完毕。");
}
} /**
* 进行"写"操作
*/
public void set(){
try {
readWriteLock.writeLock().lock();
System.out.println("线程"+Thread.currentThread().getName()+"进行写入。");
Thread.sleep(2*1000);
}catch (InterruptedException e) {
e.printStackTrace();
}finally {
readWriteLock.writeLock().unlock();
System.out.println("线程"+Thread.currentThread().getName()+"写入完毕。");
}
}
}

示例结果如下:

线程Thread-0进行读取。
线程Thread-0读取完毕。
线程Thread-1进行写入。
线程Thread-1写入完毕。
线程Thread-5进行写入。
线程Thread-5写入完毕。
线程Thread-3进行写入。
线程Thread-3写入完毕。
线程Thread-7进行写入。
线程Thread-7写入完毕。
线程Thread-9进行写入。
线程Thread-9写入完毕。
线程Thread-2进行读取。
线程Thread-4进行读取。
线程Thread-6进行读取。
线程Thread-8进行读取。
线程Thread-2读取完毕。
线程Thread-6读取完毕。
线程Thread-8读取完毕。
线程Thread-4读取完毕。

java并发:读写锁ReadWriteLock的更多相关文章

  1. Java 并发 —— 读写锁(ReadWriteLock)

    读写锁(ReadWriteLock),顾名思义,就是在读写某文件时,对该文件上锁. 1. ReentrantReadWriteLock 三部曲: 加锁: 读写操作: 解锁:(为保证解锁操作一定执行,通 ...

  2. Java 读写锁 ReadWriteLock 原理与应用场景详解

    Java并发编程提供了读写锁,主要用于读多写少的场景,今天我就重点来讲解读写锁的底层实现原理@mikechen 什么是读写锁? 读写锁并不是JAVA所特有的读写锁(Readers-Writer Loc ...

  3. 读写锁ReadWriteLock

    为了提高性能,Java提供了读写锁,在读的地方使用读锁,在写的地方使用写锁,灵活控制,如果没有写锁的情况下,读是无阻塞的,在一定程度上提高了程序的执行效率. Java中读写锁有个接口java.util ...

  4. 线程中的读写锁ReadWriteLock

    Lock锁还有两个非常强大的类 ReadWriteLock接口实现类ReentrantReadWriteLock(非常重要的锁) 想实现 读取的时候允许多线程并发访问,写入的时候不允许. 这种效果.. ...

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

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

  6. 【漫画】互斥锁ReentrantLock不好用?试试读写锁ReadWriteLock

    ReentrantLock完美实现了互斥,完美解决了并发问题.但是却意外发现它对于读多写少的场景效率实在不行.此时ReentrantReadWriteLock来救场了!一种适用于读多写少场景的锁,可以 ...

  7. 【漫画】读写锁ReadWriteLock还是不够快?再试试StampedLock!

    本文来源于公众号[胖滚猪学编程] 转载请注明出处! 在互斥锁ReentrantLock不好用?试试读写锁ReadWriteLock一文中,我们对比了互斥锁ReentrantLock和读写锁ReadWr ...

  8. 读-写锁 ReadWriteLock & 线程八锁

    读-写锁 ReadWriteLock: ①ReadWriteLock 维护了一对相关的锁,一个用于只读操作, 另一个用于写入操作. 只要没有 writer,读取锁可以由 多个 reader 线程同时保 ...

  9. java多线程-读写锁

    Java5 在 java.util.concurrent 包中已经包含了读写锁.尽管如此,我们还是应该了解其实现背后的原理. 读/写锁的 Java 实现(Read / Write Lock Java ...

  10. 显式锁(三)读写锁ReadWriteLock

    前言:   上一篇文章,已经很详细地介绍了 显式锁Lock 以及 其常用的实现方式- - ReetrantLock(重入锁),本文将介绍另一种显式锁 - - 读写锁ReadWriteLock.    ...

随机推荐

  1. html如何设置打印样式?

    转自网络,忘记出处了. html/jsp/网页/打印相关/打印预览/js设置页眉页脚 <html> <head>    <title>打印相关</title& ...

  2. (转)RRU交织冗余在LTE-R组网中的应用研究

    RRU交织冗余在LTE-R组网中的应用研究 王 芳1,2 庞萌萌1,2 (1.北京全路通信信号研究设计院集团有限公司,北京 100070; 2.北京市高速铁路运行控制系统工程技术研究中心,北京 100 ...

  3. mac osx下虚拟主机配置

    1.打开“终端(terminal)”,输入 sudo apachectl -v,此指令显示apache版本             2.开启apache,输入 sudo apachectl start ...

  4. ECharts之饼图和柱形图demo

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  5. CSS 背景background实例

    css背景background用于设置html标签元素的背景颜色.背景图片已经其他背景属性.本文章向码农介绍CSS 背景background使用方法和基本的使用实例.需要的码农可以参考一下. 一.Cs ...

  6. mysql更新(八) 可视化工具Navicat的使用 索引

    17-索引   一.索引的介绍 数据库中专门用于帮助用户快速查找数据的一种数据结构.类似于字典中的目录,查找字典内容时可以根据目录查找到数据的存放位置吗,然后直接获取. 二 .索引的作用 约束和加速查 ...

  7. CSS3基础

    内容: 1.圆角 border-radius 2.阴影 text-shadow.box-shadow 3.渐变 linear.radial 4.rgba rgb+alpha opacity 5.tra ...

  8. string hashcode 解读

    偶尔看到string hashcode方法如下 public int hashCode() { int h = hash; if (h == 0 && value.length > ...

  9. 《opencv学习》 之 特征检测与匹配

    这几天学习SURF特征检测,直接看的视频和书本有点吃不消,现在是基本看懂了,如果写博客记录没有必要,因为网上都差不多,笔记都在书上了,以下是个人认为比较浅显易懂的文章,当然海有很多好文章我没看到. 看 ...

  10. UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position

    python实现爬虫遇到编码问题: error:UnicodeEncodeError: 'gbk' codec can't encode character '\xXX' in position XX ...