zoukankan      html  css  js  c++  java
  • 【Java多线程】ReentrantLock锁原理分析(十二)

      介绍了锁和AQS:【Java多线程】队列同步器AQS(十一),阅读此篇文章请先了解AQS

    一、ReentrantLock介绍

      ReentrantLock是可重入的独占锁,同时只能有一个线程可以获取这个锁,其他线程尝试获取就会被阻塞并放入AQS阻塞队列中,

      类图结构如下:

      

    二、原理分析

      了解锁的基本原理:【Java多线程】队列同步器AQS(十一)

    2.1 示例代码  

     1 public class TestLock {
     2 
     3     //
     4     private static ReentrantLock lock = new ReentrantLock();
     5 
     6     public static void main(String[] args) {
     7 
     8         Thread t1 = new Thread(){
     9             @Override
    10             public void run() {
    11                 lock.lock();
    12                 System.out.println(Thread.currentThread().getName() + ":获得锁,进入线程。。。。");
    13                 Scanner scanner = new Scanner(System.in);
    14 //                int n = 0;
    15 //                while ((n = scanner.nextInt()) == 0) {
    16 //                    try {
    17 //                        Thread.sleep(1000);
    18 //                    } catch (InterruptedException e) {
    19 //                        e.printStackTrace();
    20 //                    }
    21 //                }
    22                 lock.unlock();
    23                 System.out.println(Thread.currentThread().getName() + ":释放锁,退出线程。。。。");
    24             }
    25         };
    26 
    27         Thread t2 = new Thread(){
    28             @Override
    29             public void run() {
    30                 lock.lock();
    31                 System.out.println(Thread.currentThread().getName() + ":获得锁,进入线程。。。。");
    32                 try {
    33                     Thread.sleep(10000);
    34                 } catch (InterruptedException e) {
    35                     e.printStackTrace();
    36                 }
    37                 lock.unlock();
    38                 System.out.println(Thread.currentThread().getName() + ":释放锁,退出线程。。。。");
    39             }
    40         };
    41 
    42         t1.setName("t1");
    43         t1.start();
    44 
    45         try {
    46             Thread.sleep(1000);
    47         } catch (InterruptedException e) {
    48             e.printStackTrace();
    49         }
    50 
    51         t2.setName("t2");
    52         t2.start();
    53     }
    54 } 

    2.2 原理图

    可根据以上代码调试,流程图

    加锁与解锁流程图

      

    同步器的状态图

      

      

      

      

  • 相关阅读:
    Shell命令之文本操作
    乘法表
    万年历
    猜数游戏
    Linux下如何进行FTP安装与设置
    CentOS 安装nload(流量统计)
    linux下创建用户并且限定用户主目录
    ftp 解决不能上传问题
    【题解】[TJOI2018]数学计算
    【平衡树做题记录】
  • 原文地址:https://www.cnblogs.com/h--d/p/14561246.html
Copyright © 2011-2022 走看看