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

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

加锁与解锁流程图

  

同步器的状态图

  

  

  

  

原文地址:https://www.cnblogs.com/h--d/p/14561246.html