• 【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 原理图

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

    加锁与解锁流程图

      

    同步器的状态图

      

      

      

      

  • 相关阅读:
    人一生要去的100个地方(世界)
    数据仓库相关书籍
    学理财要看的书籍
    数仓设计 Building the Data Warehouse
    Google Cloud 安装java
    Google Cloud install python3 (in CentOS)
    SyntaxError: Non-ASCII character 'xe5' in file test23.py on line 2, but no encoding declared;
    CentOS 安装7z
    CentOS 安装 MySQL
    复杂迭代代码分析
  • 原文地址:https://www.cnblogs.com/h--d/p/14561246.html
Copyright © 2020-2023  润新知