- 线程等待通知机制总结
- 概述
一个线程的等待阻塞状态,受另外一个线程控制。
Object.wait() Object.notify() |
特点 |
必须基于特定的对象锁synchronized |
Notify只会对已经处于wait状态的线程生效。 |
||
使用 |
必须在synchronized(obj)代码内部使用,否则会抛出异常 |
|
原理 |
线程等待/唤醒在特定的对象锁obj上 |
|
线程中断 |
Wait()中的线程,被其他线程t.interrupt()后,可中断阻塞状态,继续执行代码,并抛出interruptedException异常。 |
|
LockSupport.park() LockSupport.unpark(t) |
特点 |
不需要维护同一对象,可实现模块之间的解耦 |
Unpark可对已经处于park(),或者下次处于park()状态的线程生效 |
||
原理 |
内部调用的是unsafe.park/unpark()方法实现的 |
|
线程中断 |
Park()中的线程,被其他线程t.interrupt()后,可中断阻塞状态,继续执行代码,不抛出interruptedException异常。 |
-
- Object.wait()/notify()
- 使用案例
- Object.wait()/notify()
-
-
- 运行结果
-
-
-
- 特点
-
多个线程用于维护同一个对象锁。
Wait notify等需要在synchronized对象锁内部调用,否则会抛出IllegalMonitorStateException。
-
-
- 使用场景
-
生产消费者模型
-
- LockSupport.park()/unpark()
- 使用案例
- LockSupport.park()/unpark()
-
-
- 运行结果
-
-
-
- 特点
-
两个线程之间不需要维护同一个对象,可以实现模块之间的解耦。
Unpark可以在park之前调用,可以对之后的线程t的一次park进行唤醒。
-
-
- 使用场景
-
基于CAS原理,用于实现锁的内部机制。
-
- lock.lock()/unlock() condition.await()/asignal()
- 使用案例
- lock.lock()/unlock() condition.await()/asignal()
-
-
- 运行结果
-
1 2 A 3 4 B 5 6 C
-
-
- 特点
-
多个线程之间需要维护同一个可重入的互斥锁ReentrantLock,同时基于该锁建立多个条件队列(和线程种类数相同),在线程A执行到特定条件下阻塞await()当前线程的条件队列并唤醒asignal()特定线程的条件队列。
-
-
- 使用场景
-
允许线程在一定时间内获取锁,获取失败则返回(而非陷入休眠);
允许读写锁分离的场景;
允许以任何顺序获取和释放多个锁。