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)的更多相关文章

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

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

  2. 聊聊高并发(二十九)解析java.util.concurrent各个组件(十一) 再看看ReentrantReadWriteLock可重入读-写锁

    上一篇聊聊高并发(二十八)解析java.util.concurrent各个组件(十) 理解ReentrantReadWriteLock可重入读-写锁 讲了可重入读写锁的基本情况和基本的方法,显示了怎样 ...

  3. 聊聊高并发(二十八)解析java.util.concurrent各个组件(十) 理解ReentrantReadWriteLock可重入读-写锁

    这篇讲讲ReentrantReadWriteLock可重入读写锁,它不仅是读写锁的实现,而且支持可重入性. 聊聊高并发(十五)实现一个简单的读-写锁(共享-排他锁) 这篇讲了怎样模拟一个读写锁. 可重 ...

  4. 【java并发编程】ReentrantLock 可重入读写锁

    目录 一.ReentrantLock可重入锁 二.ReentrantReadWriteLock读写锁 三.读锁之间不互斥 欢迎关注我的博客,更多精品知识合集 一.ReentrantLock可重入锁 可 ...

  5. 018-并发编程-java.util.concurrent.locks之-ReentrantReadWriteLock可重入读写锁

    一.概述 ReentrantLock是一个排他锁,同一时间只允许一个线程访问,而ReentrantReadWriteLock允许多个读线程同时访问,但不允许写线程和读线程.写线程和写线程同时访问.相对 ...

  6. Java基础-Java中的并法库之线程池技术

    Java基础-Java中的并法库之线程池技术 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是线程池技术 二.

  7. java基础---->java中正则表达式二

    跟正则表达式相关的类有:Pattern.Matcher和String.今天我们就开始Java中正则表达式的学习. Pattern和Matcher的理解 一.正则表达式的使用方法 一般推荐使用的方式如下 ...

  8. Java基础学习中一些词语和语句的使用

    在Java基础学习中,我们刚接触Java会遇到一些词和语句的使用不清的情况,不能很清楚的理解它的运行效果会是怎么样的,如:break,continue在程序中运行效果及跳转位置, 1.先来看看brea ...

  9. Java基础-Java中的堆内存和离堆内存机制

    Java基础-Java中的堆内存和离堆内存机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

随机推荐

  1. python高并发和多线程的关系

    “高并发和多线程”总是被一起提起,给人感觉两者好像相等,实则 高并发 ≠ 多线程 多线程是完成任务的一种方法,高并发是系统运行的一种状态,通过多线程有助于系统承受高并发状态的实现.   高并发是一种系 ...

  2. 使用开源项目免费申请 JetBrains 全家桶 IDEA 开源许可证

    JetBrains 公司旗下的 IDEA 功能都十分强大,深受各种编程语言相关的程序员的喜爱.我个人而言,经常使用 WebStorm,也使用过 PyCharm. 正常情况下 JetBrains 公司的 ...

  3. arduino驱动安装

    方法一:使用官方提供的一键安装程序安装 打开Arduino在你电脑上的位置如果你的电脑是32位系统,就运行dpinst-x86.exe如果是64位系统,就运行dpinst-amd64.exe然后在弹出 ...

  4. cf 1029D

    题面 题目描述 给定含n个整数的数组a. 规定数x,y的合并为xy.如:数12与数3456的合并为数123456. 有数组中的位置对(i,j)(i≠j),计算使ai,aj的合并能被k整除的位置对数量. ...

  5. CodeMirror 小册子

    User manual and reference guide      version 5.41.1 用户手册和参考指南 CodeMirror is a code-editor component ...

  6. 【MOOC EXP】Linux内核分析实验五报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 分析system_call中断处理过程 ...

  7. YQCB冲刺第二周绩效评价

    标准队员 工作质量 20% 工作态度 20% 工作量 30% 工作难易程度 20% 团队意识 10% 总分 陈美琪 17 18 24 17 9 85 张晨阳 19 19 27 19 9 93 刘昭为 ...

  8. OneZero第二周第四次站立会议(2016.3.31)

    会议时间:2016年3月30日  13:00~13:20 会议成员:冉华,张敏,王巍,夏一鸣. 会议目的:汇报前一天工作,全体成员评论,确定会后修改内容或分配下一步任务. 会议内容: 1.前端,夏.张 ...

  9. vagrant 入门

    0.说明 本门所有的操作都是基于mac.windows可做相应调整,大体流程是一样的. 1.什么是vagrant 通俗来讲vagrant是一个通过命令行,来管理虚拟机的工具,vagrant本身并没有提 ...

  10. Easy-UI开发总结

    Easy-UI开发总结 jQuery EasyUI 简介 jQuery EasyUI 是一个基于 jQuery 的框架,集成了各种用户界面插件. 什么是 jQuery EasyUI jQuery Ea ...