一.Object 类中的wait和notify方法实现线程等待和唤醒
异常情况
1.必须持有锁,都在synchronized ()代码块内
2.必须先wait,后notify
二.Condition接口中的await和signal方法实现实现线程的等待和唤醒
1.在锁块内(synchronized 或者lock)
2.先await,后signal
三.LockSupport类中的park 等待和unpark唤醒(许可证)
LockSupport.park();
LockSupport.unpark();
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.LockSupport;
public class ParkAndUnparkDemo {
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
System.out.println("come in....");
LockSupport.park();
System.out.println("被唤醒....");
}, "t1");
t1.start();
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(()->{
LockSupport.unpark(t1);
System.out.println("发出通知....");
},"t2").start();
}
}
1.正常,无锁块要求
2.支持先唤醒后等待
3.成双成对
注意⚠️:
1.先unpack(),再执行park()无效,没有阻塞效果。
解释如下,先执行unpack(),导致park()方法形同虚设。举个例子:类似于高速公路的ETC,提前买好了通行证unpack,到闸机处直接抬起栏杆放行了,没有park拦截了。有证就放行。
2.许可证不会累计增加,只有一张
结果:阻塞