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