在Java基础线程状态分析中,LockSupport.park()会使线程进入waiting状态,那么这个park方法是啥,查看源码发现其底层还是调用native方法(Unsafe.park()),此文只讲述park用法,cpp底层代码分析吃力。。。
根据Lock文档描述,每个线程有个许可,当获取不到线程许可的时候,线程是不可用的,即处于waiting或者(timed_waiting状态);当执行park后,只有执行unpark或者线程interrupt或者虚假唤醒
park许可只有0和大于0 。当线程的许可大于0,park不堵塞;unpark不叠加,当执行unpark会使许可大于0。
1. 2次park,不unpark,线程waiting
public class LockPark {
private static int num = 0;
public static void main(String[] args) {
Thread thread = new Thread(() -> {
while (num < 2) {
System.out.println(Thread.currentThread().getName() + ":park begin");
LockSupport.park();
System.out.println(Thread.currentThread().getName() + ":park first");
LockSupport.park();
System.out.println(Thread.currentThread().getName() + ":park second");
}
});
thread.start();
// LockSupport.unpark(thread);
// System.out.println(thread.getName() + ":unpark first");
num++;
}
}
复制代码
2. 2次park,1次unpark
public class LockPark {
private static int num = 0;
public static void main(String[] args) {
Thread thread = new Thread(() -> {
while (num < 2) {
System.out.println(Thread.currentThread().getName() + ":park begin");
LockSupport.park();
System.out.println(Thread.currentThread().getName() + ":park first");
LockSupport.park();
System.out.println(Thread.currentThread().getName() + ":park second");
}
});
thread.start();
LockSupport.unpark(thread);
System.out.println(thread.getName() + ":unpark first");
num++;
}
}
复制代码
3. 2次park,2次unpark
public class LockPark {
private static int num = 0;
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(() -> {
while (num < 2) {
System.out.println(Thread.currentThread().getName() + ":park begin");
LockSupport.park();
System.out.println(Thread.currentThread().getName() + ":park first");
LockSupport.park();
System.out.println(Thread.currentThread().getName() + ":park second");
}
});
thread.start();
LockSupport.unpark(thread);
System.out.println(thread.getName() + ":unpark first&#