• Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock)


             Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock)        

                                             作者:尹正杰

    版权声明:原创作品,谢绝转载!否则将追究法律责任。

       在学习Java的之前,你可能已经听说过读锁,写锁,读写锁,乐观锁,悲观锁。这些名词在学习数据库的时候几乎每个人都会有所了解的!当你学习java网络编程时,尤其是在处理多并发的情况时,你可能用过“synchronized”关键字是同步的方法,它可以用来同步代码块也可以用来同步方法。但JAVA中的锁并不是只有“synchronized”哟,在Java的并发库中你可能会进程看到一些可重入所(ReentrantLock)。

      本篇博客就以重入读写锁(ReentrantReadWriteLock)来测试当两个线程的读锁和写锁是否可用同时访问。

    一.两个线程同时上读锁的情况

    1>.测试代码如下:

     1 /*
     2 @author :yinzhengjie
     3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
     4 EMAIL:y1053419035@qq.com
     5 */
     6 package cn.org.yinzhengjie.nio;
     7 
     8 import java.util.concurrent.locks.ReentrantReadWriteLock;
     9 
    10 /**
    11  * 重入锁测试
    12  */
    13 public class ReentrantLockDemo {
    14     public static void main(String[] args) {
    15         //通过并法库包的ReentrantReadWriteLock获取读写锁,里面既包含读锁也包含写锁。
    16         final ReentrantReadWriteLock lock = new ReentrantReadWriteLock() ;
    17 
    18         //开启2个线程,看他们谁先抢到线程谁就会先打印数据。最好是通过IDE的调试方法查看他们的执行过程。
    19         new Thread(){
    20             public void run() {
    21                 //上读锁
    22                 lock.readLock().lock();
    23                 System.out.println("xxx");
    24                 //解读锁
    25                 lock.readLock().unlock();
    26             }
    27         }.start();
    28 
    29         new Thread(){
    30             public void run() {
    31                 //上读锁
    32                 lock.readLock().lock();
    33                 System.out.println("yyy");
    34                 //上读锁
    35                 lock.readLock().unlock();
    36             }
    37         }.start();
    38     }
    39 }

    2>.IDEA打断点注意事项

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

     

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

    5>.运行线程2的代码

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

     

    7>.得出结论

       答:在同一个程序中,一个线程拿到读锁且未释放锁时,另一个线程仍然可以继续使用读锁,他们之间并不互相影响!

     

    二.两个线程一个上读锁,一个上写锁的情况

    1>.测试代码

     1 /*
     2 @author :yinzhengjie
     3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
     4 EMAIL:y1053419035@qq.com
     5 */
     6 package cn.org.yinzhengjie.nio;
     7 
     8 import java.util.concurrent.locks.ReentrantReadWriteLock;
     9 
    10 /**
    11  * 重入锁测试
    12  */
    13 public class ReentrantLockDemo {
    14     public static void main(String[] args) {
    15         //通过并法库包的ReentrantReadWriteLock获取读写锁,里面既包含读锁也包含写锁。
    16         final ReentrantReadWriteLock lock = new ReentrantReadWriteLock() ;
    17 
    18         //开启2个线程,看他们谁先抢到线程谁就会先打印数据。最好是通过IDE的调试方法查看他们的执行过程。
    19         new Thread(){
    20             public void run() {
    21                 //上读锁
    22                 lock.readLock().lock();
    23                 System.out.println("xxx");
    24                 //解读锁
    25                 lock.readLock().unlock();
    26             }
    27         }.start();
    28 
    29         new Thread(){
    30             public void run() {
    31                 //上写锁
    32                 lock.writeLock().lock();
    33                 System.out.println("yyy");
    34                 //解写锁
    35                 lock.writeLock().unlock();
    36             }
    37         }.start();
    38     }
    39 }

    2>.执行第一个线程

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

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

    5>.得出结论

      答:当一个线程拿到读锁时,另一个线程无法使用写锁!

    三.两个线程一个上写锁,一个上读锁的情况

    1>.测试代码

     1 /*
     2 @author :yinzhengjie
     3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
     4 EMAIL:y1053419035@qq.com
     5 */
     6 package cn.org.yinzhengjie.nio;
     7 
     8 import java.util.concurrent.locks.ReentrantReadWriteLock;
     9 
    10 /**
    11  * 重入锁测试
    12  */
    13 public class ReentrantLockDemo {
    14     public static void main(String[] args) {
    15         //通过并法库包的ReentrantReadWriteLock获取读写锁,里面既包含读锁也包含写锁。
    16         final ReentrantReadWriteLock lock = new ReentrantReadWriteLock() ;
    17 
    18         //开启2个线程,看他们谁先抢到线程谁就会先打印数据。最好是通过IDE的调试方法查看他们的执行过程。
    19         new Thread(){
    20             public void run() {
    21                 //上读锁
    22                 lock.writeLock().lock();
    23                 System.out.println("xxx");
    24                 //解读锁
    25                 lock.writeLock().unlock();
    26             }
    27         }.start();
    28 
    29         new Thread(){
    30             public void run() {
    31                 //上写锁
    32                 lock.readLock().lock();
    33                 System.out.println("yyy");
    34                 //解写锁
    35                 lock.readLock().unlock();
    36             }
    37         }.start();
    38     }
    39 }

    2>.执行第一个线程

     

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

     

    4>.执行第二线程

     

    5>.得出结论

      答:当一个线程拿到写锁时,另一个线程无法使用读锁!

    四.两个线程同时上写锁的情况

    1>.测试代码

     1 /*
     2 @author :yinzhengjie
     3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
     4 EMAIL:y1053419035@qq.com
     5 */
     6 package cn.org.yinzhengjie.nio;
     7 
     8 import java.util.concurrent.locks.ReentrantReadWriteLock;
     9 
    10 /**
    11  * 重入锁测试
    12  */
    13 public class ReentrantLockDemo {
    14     public static void main(String[] args) {
    15         //通过并法库包的ReentrantReadWriteLock获取读写锁,里面既包含读锁也包含写锁。
    16         final ReentrantReadWriteLock lock = new ReentrantReadWriteLock() ;
    17 
    18         //开启2个线程,看他们谁先抢到线程谁就会先打印数据。最好是通过IDE的调试方法查看他们的执行过程。
    19         new Thread(){
    20             public void run() {
    21                 //上读锁
    22                 lock.writeLock().lock();
    23                 System.out.println("xxx");
    24                 //解读锁
    25                 lock.writeLock().unlock();
    26             }
    27         }.start();
    28 
    29         new Thread(){
    30             public void run() {
    31                 //上写锁
    32                 lock.writeLock().lock();
    33                 System.out.println("yyy");
    34                 //解写锁
    35                 lock.writeLock().unlock();
    36             }
    37         }.start();
    38     }
    39 }

    2>.执行第一个线程

     

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

     

    4>.执行第二线程

     

    5>.得出结论

       答:当一个线程拿到写锁时,另一个线程无法使用写锁!

         

  • 相关阅读:
    E. Arranging The Sheep
    B. Box Fitting
    E. Permutation by Sum
    D. Corrupted Array
    联通 F677V2 光猫改桥接
    IntelliJ IDEA 常用快捷键整理
    Git 常用命令速查表
    Git 入门操作指南
    Anaconda 常用命令总结
    VS code 快捷键整理
  • 原文地址:https://www.cnblogs.com/yinzhengjie/p/9261415.html
Copyright © 2020-2023  润新知