- 线程等待通知机制总结
- 概述
一个线程的等待阻塞状态,受另外一个线程控制。
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()特定线程的条件队列。
-
-
- 使用场景
-
允许线程在一定时间内获取锁,获取失败则返回(而非陷入休眠);
允许读写锁分离的场景;
允许以任何顺序获取和释放多个锁。