1. 相对底层
    2. 不是基于AQS实现的,Exchanger也不是用AQS,而是LockSupport???
    3. 那Phaser呢?
    4. 在之前的时候很难控制指定具体的一个线程让他阻塞或者停止,有了LockSupport之后就可以了
    5. 在jdk中添加了LockSupport这个api,他比
    6. park停止、停车,阻塞在那;在主线程中可以用unpark(t)来解除t的阻塞
    7. 为了实现锁支持的类,可以直接拿来用,而不用用synchronized或者其他锁去获取锁
    8. LockSupport实现的功能是当前线程阻塞—->之前得加在某把锁上(wait、await、lock),之前不管用哪个都得加在某一把锁上(synchronized);而现在的LockSupport就完全不需要了,想什么时候停就什么时候停
    9. 之前叫醒线程用notify、unlock,并且之前的阻塞线程是在等待队列中,要想叫醒一个指定线程还是比较费劲的;但LockSupport可以叫醒指定线程,很方便
    10. unpark可以在park之前调用,但是这也是基于线程start了之后,没有start时进行unpark是没有效果的
    11. unpark在线程一开始运行就调用,这样在线程运行中再调用park就不起作用了
    12. 之前的notify不能在wait之前调用,因为那样不起作用;必须得先wait了,调用notify才能起作用
    13. unpark可以先调,先调代表线程中的某个状态改变了,但是我已经给你放行了,即便你之后要停车也没用,因为unpark已经告诉你停车挺不住了;unpark把之后的park给取消了
    14. image.png
    15. 用法上,比synchronized的notify更灵活
    1. package com.mashibing.juc.c_020;
    2. import java.util.concurrent.TimeUnit;
    3. import java.util.concurrent.locks.LockSupport;
    4. public class T13_TestLockSupport {
    5. public static void main(String[] args) {
    6. Thread t = new Thread(()->{
    7. for (int i = 0; i < 10; i++) {
    8. System.out.println(i);
    9. if(i == 5) {
    10. LockSupport.park();
    11. }
    12. try {
    13. TimeUnit.SECONDS.sleep(1);
    14. } catch (InterruptedException e) {
    15. e.printStackTrace();
    16. }
    17. }
    18. });
    19. t.start();
    20. LockSupport.unpark(t);
    21. /*try {
    22. TimeUnit.SECONDS.sleep(8);
    23. } catch (InterruptedException e) {
    24. e.printStackTrace();
    25. }
    26. System.out.println("after 8 senconds!");
    27. LockSupport.unpark(t);*/
    28. }
    29. }