Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock)
Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock)
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
在学习Java的之前,你可能已经听说过读锁,写锁,读写锁,乐观锁,悲观锁。这些名词在学习数据库的时候几乎每个人都会有所了解的!当你学习java网络编程时,尤其是在处理多并发的情况时,你可能用过“synchronized”关键字是同步的方法,它可以用来同步代码块也可以用来同步方法。但JAVA中的锁并不是只有“synchronized”哟,在Java的并发库中你可能会进程看到一些可重入所(ReentrantLock)。
本篇博客就以重入读写锁(ReentrantReadWriteLock)来测试当两个线程的读锁和写锁是否可用同时访问。
一.两个线程同时上读锁的情况
1>.测试代码如下:
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.nio; import java.util.concurrent.locks.ReentrantReadWriteLock; /**
* 重入锁测试
*/
public class ReentrantLockDemo {
public static void main(String[] args) {
//通过并法库包的ReentrantReadWriteLock获取读写锁,里面既包含读锁也包含写锁。
final ReentrantReadWriteLock lock = new ReentrantReadWriteLock() ; //开启2个线程,看他们谁先抢到线程谁就会先打印数据。最好是通过IDE的调试方法查看他们的执行过程。
new Thread(){
public void run() {
//上读锁
lock.readLock().lock();
System.out.println("xxx");
//解读锁
lock.readLock().unlock();
}
}.start(); new Thread(){
public void run() {
//上读锁
lock.readLock().lock();
System.out.println("yyy");
//上读锁
lock.readLock().unlock();
}
}.start();
}
}
2>.IDEA打断点注意事项

3>.运行Debug模式并进入第一个线程

4>.查看控制台输出信息

5>.运行线程2的代码

6>.查看线程2的控制台

7>.得出结论
答:在同一个程序中,一个线程拿到读锁且未释放锁时,另一个线程仍然可以继续使用读锁,他们之间并不互相影响!
二.两个线程一个上读锁,一个上写锁的情况
1>.测试代码
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.nio; import java.util.concurrent.locks.ReentrantReadWriteLock; /**
* 重入锁测试
*/
public class ReentrantLockDemo {
public static void main(String[] args) {
//通过并法库包的ReentrantReadWriteLock获取读写锁,里面既包含读锁也包含写锁。
final ReentrantReadWriteLock lock = new ReentrantReadWriteLock() ; //开启2个线程,看他们谁先抢到线程谁就会先打印数据。最好是通过IDE的调试方法查看他们的执行过程。
new Thread(){
public void run() {
//上读锁
lock.readLock().lock();
System.out.println("xxx");
//解读锁
lock.readLock().unlock();
}
}.start(); new Thread(){
public void run() {
//上写锁
lock.writeLock().lock();
System.out.println("yyy");
//解写锁
lock.writeLock().unlock();
}
}.start();
}
}
2>.执行第一个线程

3>.查看控制端是有内容输出的

4>.切换到第二个线程执行代码

5>.得出结论
答:当一个线程拿到读锁时,另一个线程无法使用写锁!
三.两个线程一个上写锁,一个上读锁的情况
1>.测试代码
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.nio; import java.util.concurrent.locks.ReentrantReadWriteLock; /**
* 重入锁测试
*/
public class ReentrantLockDemo {
public static void main(String[] args) {
//通过并法库包的ReentrantReadWriteLock获取读写锁,里面既包含读锁也包含写锁。
final ReentrantReadWriteLock lock = new ReentrantReadWriteLock() ; //开启2个线程,看他们谁先抢到线程谁就会先打印数据。最好是通过IDE的调试方法查看他们的执行过程。
new Thread(){
public void run() {
//上读锁
lock.writeLock().lock();
System.out.println("xxx");
//解读锁
lock.writeLock().unlock();
}
}.start(); new Thread(){
public void run() {
//上写锁
lock.readLock().lock();
System.out.println("yyy");
//解写锁
lock.readLock().unlock();
}
}.start();
}
}
2>.执行第一个线程

3>.查看第一个线程输出的内容

4>.执行第二线程

5>.得出结论
答:当一个线程拿到写锁时,另一个线程无法使用读锁!
四.两个线程同时上写锁的情况
1>.测试代码
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.nio; import java.util.concurrent.locks.ReentrantReadWriteLock; /**
* 重入锁测试
*/
public class ReentrantLockDemo {
public static void main(String[] args) {
//通过并法库包的ReentrantReadWriteLock获取读写锁,里面既包含读锁也包含写锁。
final ReentrantReadWriteLock lock = new ReentrantReadWriteLock() ; //开启2个线程,看他们谁先抢到线程谁就会先打印数据。最好是通过IDE的调试方法查看他们的执行过程。
new Thread(){
public void run() {
//上读锁
lock.writeLock().lock();
System.out.println("xxx");
//解读锁
lock.writeLock().unlock();
}
}.start(); new Thread(){
public void run() {
//上写锁
lock.writeLock().lock();
System.out.println("yyy");
//解写锁
lock.writeLock().unlock();
}
}.start();
}
}
2>.执行第一个线程

3>.查看第一个线程输出的内容

4>.执行第二线程

5>.得出结论
答:当一个线程拿到写锁时,另一个线程无法使用写锁!
Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock)的更多相关文章
- java 可重入读写锁 ReentrantReadWriteLock 详解
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt206 读写锁 ReadWriteLock读写锁维护了一对相关的锁,一个用于只 ...
- 聊聊高并发(二十九)解析java.util.concurrent各个组件(十一) 再看看ReentrantReadWriteLock可重入读-写锁
上一篇聊聊高并发(二十八)解析java.util.concurrent各个组件(十) 理解ReentrantReadWriteLock可重入读-写锁 讲了可重入读写锁的基本情况和基本的方法,显示了怎样 ...
- 聊聊高并发(二十八)解析java.util.concurrent各个组件(十) 理解ReentrantReadWriteLock可重入读-写锁
这篇讲讲ReentrantReadWriteLock可重入读写锁,它不仅是读写锁的实现,而且支持可重入性. 聊聊高并发(十五)实现一个简单的读-写锁(共享-排他锁) 这篇讲了怎样模拟一个读写锁. 可重 ...
- 【java并发编程】ReentrantLock 可重入读写锁
目录 一.ReentrantLock可重入锁 二.ReentrantReadWriteLock读写锁 三.读锁之间不互斥 欢迎关注我的博客,更多精品知识合集 一.ReentrantLock可重入锁 可 ...
- 018-并发编程-java.util.concurrent.locks之-ReentrantReadWriteLock可重入读写锁
一.概述 ReentrantLock是一个排他锁,同一时间只允许一个线程访问,而ReentrantReadWriteLock允许多个读线程同时访问,但不允许写线程和读线程.写线程和写线程同时访问.相对 ...
- Java基础-Java中的并法库之线程池技术
Java基础-Java中的并法库之线程池技术 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是线程池技术 二.
- java基础---->java中正则表达式二
跟正则表达式相关的类有:Pattern.Matcher和String.今天我们就开始Java中正则表达式的学习. Pattern和Matcher的理解 一.正则表达式的使用方法 一般推荐使用的方式如下 ...
- Java基础学习中一些词语和语句的使用
在Java基础学习中,我们刚接触Java会遇到一些词和语句的使用不清的情况,不能很清楚的理解它的运行效果会是怎么样的,如:break,continue在程序中运行效果及跳转位置, 1.先来看看brea ...
- Java基础-Java中的堆内存和离堆内存机制
Java基础-Java中的堆内存和离堆内存机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
随机推荐
- 05-python基础
1.python是什么? 解释性语言.高级语言.开源.简洁.方便.容易扩展 2.可变类型与不可变类型 可变类型:list.dict.可变集合set 不可变类型:数字,str,tuple元组,froze ...
- JavaScript快速入门-ECMAScript本地对象(Number)
Number 对象是原始数值的包装对象. 创建一个Number对象:var myNum=new Number(value); 注意: 1.参数 value 是要创建的 Number 对象的数值,或是要 ...
- REST-framework快速构建API--认证
一.API使用流程 使用过API的同学都知道,我们不可能任意调用人家的API,因为通过API可以获取很多关键数据,而且这个API可能供多个部门或个人使用,所以必须是经过授权的用户才能调用. API的使 ...
- Qt QpushButton 实现长按下功能
做项目需要一个按钮具备长时间按下的功能,才发现Qt原始的按钮是没有这个功能,不过Qt的原生按钮是存在按下和释放信号的,有了这两个信号,再来实现按钮长时间被按下,这就简单了,看下动画演示. 录成GIF效 ...
- 开发认为不是bug,你该如何处理?
这是软件测试员面试时经常被问到的问题.看了很多答案,个人觉得作为有工作经验的测试人员回答时不能完全照搬标准答案,技术面试官想听的当然不止如此.毕竟这种情况在实际工作中也常常出现,具体问题要具体分析,你 ...
- OpenGL学习(3)——Shader
之前已经接触过Vertex Shader和Fragment Shader,这次学习如何编写Shader并封装成类. Shader源码主要有四部分: 版本声明 #version xxx core: 使用 ...
- 论文阅读 | Clustrophile 2: Guided Visual Clustering Analysis
论文地址 论文视频 左侧边栏可以导入数据,或者打开以及前保存的结果.右侧显示了所有的日志,可以轻松回到之前的状态,视图的主区域上半部分是数据,下半部分是聚类视图. INTRODUCTION 数据聚类对 ...
- React Router学习
React Router教程 本教程引用马伦老师的的教程 React项目的可用的路由库是React-Router,当然这也是官方支持的.它也分为: react-router 核心组件 react-ro ...
- centos上部署mysql
本文记录整个安装的过程和跳进的坑,大家预祝我能从坑里爬出来吧 当前系统版本 开始我们的安装: 在安装之前查阅了部分资料,大体安装流程 yum -y install mysql yum -y insta ...
- Linux内核的启动过程分析
秦鼎涛 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验目的及要求: 使用gdb跟踪调试内核从s ...