JAVA并发编程学习笔记09-LockSupport
基本使用
关键方法
- park():使当前线程暂停,类似wait()方法
- unpark(Thread thread):唤醒指定线程,类似notify()方法
1.先调用park()再调用unpark()方法
@Slf4j
public class Test {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
log.info("park start");
LockSupport.park();
log.info("park end");
});
t1.start();
Thread.sleep(1000);
log.info("unpark");
LockSupport.unpark(t1);
}
}
返回结果可以看到,在调用了park方法后,线程t1处于暂停状态,当主线程调用unpark方法唤醒t1后,t1苏醒。
2.先调用unpark()再调用park()方法
@Slf4j
public class Test {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("park start");
LockSupport.park();
log.info("park end");
});
t1.start();
Thread.sleep(1000);
log.info("unpark");
LockSupport.unpark(t1);
}
}
返回结果可以看出,先调用unpark后,t1线程调用park后并未进入休眠
原理
JAVA每个线程底层都有对应的Parker对象,其中有一个关键的属性counter,当调用park()时,是判断counter是否为1,若为1,则直接放行,然后将counter设为0,若为0,则休眠。调用unpark则是将counter设为1,故当先调用unpark方法再调用park不会进入休眠。
区别wait()和notify()
- wait()、notify()基于Monitor,需要synchnorized支持,而park()、unpark()基于Parker对象,不需要加锁。
- wait()方法必须在notify()方法之前才能被唤醒,而park()方法可以先unpark().