ReentrantReadWriteLock类为读写锁。
读写锁也有两个锁,一个是读操作相关的锁,称为共享锁;
另一个是写操作相关的锁,也叫排他锁。
也就是多个读锁之间不互斥,读锁与写锁互斥,写锁与写锁互斥。

一个线程拥有了对象A的写锁,在释放写锁前其他线程无法获得A的读锁、写锁,因此其他线程此时无法读写;
一个线程拥有了对象A的读锁,在释放前其他线程可以获得A的读锁但无法获得A的写锁,因此其他线程此时可以读不可以写。
不加读锁的话其他线程是可以读,但也可以写,这时就可能导致数据不一致了

读锁共享

使用lock.readLock()读锁可以提高程序运行效率,允许多个线程同时执行lock()方法后面的代码

import java.util.concurrent.locks.ReentrantReadWriteLock;public class Service {private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();public void read(){try {lock.readLock().lock();System.out.println("获得读锁"+Thread.currentThread().getName()+" "+System.currentTimeMillis());Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}finally {lock.readLock().unlock();}}
}public class ThreadA extends Thread{private Service service = new Service();public ThreadA(Service service){super();this.service = service;}@Overridepublic void run(){service.read();}
}public class ThreadB extends Thread{private Service service = new Service();public ThreadB(Service service){super();this.service = service;}@Overridepublic void run(){service.read();}
}public class Run {public static void main(String[] args) {Service service = new Service();ThreadA a = new ThreadA(service);ThreadB b = new ThreadB(service);a.setName("A");b.setName("B");a.start();b.start();}
}

写锁互斥

使用写锁代码lock.writeLock()的效果就是同一时间只允许一个线程执行lock()方法后面的代码

import java.util.concurrent.locks.ReentrantReadWriteLock;public class Service {private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();public void writeLock(){try {lock.writeLock().lock();System.out.println("进入写锁:"+Thread.currentThread().getName()+" 时间:"+System.currentTimeMillis());Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}finally{lock.writeLock().unlock();}}
}public class ThreadA extends Thread{private Service service;public ThreadA(Service service){super();this.service = service;}@Overridepublic void run(){service.writeLock();}
}public class ThreadB extends Thread{private Service service;public ThreadB(Service service){super();this.service = service;}@Overridepublic void run(){service.writeLock();}
}public class Run {public static void main(String[] args){Service s = new Service();ThreadA a = new ThreadA(s);ThreadB b = new ThreadB(s);a.setName("A");b.setName("B");a.start();b.start();}
}

线程:ReentrantReadWriteLock类相关推荐

  1. 线程基类的构建与代码实践

    在C++中常用到线程来执行相应的任务,一般会构建一个线程基类,其他的线程类型通过继承的方式来实现不同的功能. 所实现的代码考虑了windows和linux平台的兼容性,且具有代表性,在工程实践中具有参 ...

  2. 线程工具类(根据电脑逻辑处理器个数控制同时运行的线程个数)

    代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...

  3. java线程组 线程池_JAVA多线程(三)-----线程组、线程池和线程相关类

    一.线程组和未处理的异常 Thread类提供了如下几个构造器来设置新创建的线程属于哪个线程组: Thread(ThreadGroup group,Runnable target):以target的ru ...

  4. java 重启线程_java 可重启线程及线程池类的设计(详解)

    了解JAVA多线程编程的人都知道,要产生一个线程有两种方法,一是类直接继承Thread类并实现其run()方法:二是类实现Runnable接口并实现其run()方法,然后新建一个以该类为构造方法参数的 ...

  5. Java并发编程—线程同步类

    原文作者:洲洋1984 原文地址:Java 并发包中的高级同步工具 Java 中的并发包指的是 java.util.concurrent(简称 JUC)包和其子包下的类和接口,它为 Java 的并发提 ...

  6. 自定义线程池-线程池类和测试类编写

    package com.leon.demo01;import java.util.Collections; import java.util.LinkedList; import java.util. ...

  7. Larbin源代码分析[6]LARBIN中线程处理类

    一 线程类 larbin下的线程操作类,主要在mypthread.h中定义,实质上是利用宏定义,封装了pthread.h中的系统调用. 一个进程可以有多个线程,每个线程都有自己的处理流程. 二 具体实 ...

  8. Qt 学习之路 :Qt 线程相关类

      希望上一章有关事件循环的内容还没有把你绕晕.本章将重新回到有关线程的相关内容上面来.在前面的章节我们了解了有关QThread类的简单使用.不过,Qt 提供的有关线程的类可不那么简单,否则的话我们也 ...

  9. 线程同步类实现【国际化翻译案例+机场安检案例】

    精选30+云产品,助力企业轻松上云!>>> 一.线程同步类属于JUC的线程同步类,这些类使得线程之间的协调更加容易,支持了丰富的线程协调场景.逐步淘汰了Object的wait()和n ...

最新文章

  1. pandas高级处理-数据离散化
  2. SAP SD之如何配置发票分割开票
  3. WWDC 2018:iOS 内存深入研究
  4. PSVR开发者需要了解的9件事
  5. linux crontab 管理,linux crontab 命令详解
  6. cmake / cmake --build 如何理解
  7. MySQL流程控制函数-case结构
  8. matlab怎么画单位圆的切线,matlab绘图曲线标注怎么输出角度单位,就是那个小圆圈?...
  9. 【数学】Element Swapping
  10. Android 系统(246)---SystemServer进程的启动流程
  11. java string 栈_Java堆和栈的区别(String类)
  12. 解决 fatal: Not a git repository (or any of the parent directories): .git 问题
  13. linux内核文件恢复,linux下系统文件恢复
  14. Java解码aac,Android MediaCodec解码AAC,AudioTrack播放PCM音频
  15. ui自动化模拟键盘按键
  16. SQL中去重的三种方式
  17. 交换Button中图片与文字左右位置
  18. 管理是管事,领导是带人!
  19. 谈谈Python的编译和反编译
  20. iOS--上传AppStore时遇到的10个大坑

热门文章

  1. android设备局域网中快速搜索之cling方式
  2. 怎样设定目标(五)——设定目标失败的七大原因
  3. img标签使用默认图片的一种方式
  4. 用Jquery控制文本框只能输入数字和字母及jquery自定义方法$.fn
  5. 关于VS打包程序无法弹出主界面的问题
  6. SqlServer项目经验:介质集有2个介质簇,但只提供了1个。必须提供所有成员
  7. java语言解析XML
  8. LinDaiDai的 2019 面试准备
  9. 手把手教渗透测试人员打造.NET可执行文件
  10. vi/vim 中批量在行插入或删除指定字符