介绍了锁和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 原理图
可根据以上代码调试,流程图
加锁与解锁流程图
同步器的状态图