多线程通讯的api:
wait 和notify、notifyAll
原理:
wait的实现原理是利用对象的等待队列,执行的时候会给锁的对象的等待队列加一条,执行的时候会释放当前锁,让其他线程正常调用锁对象。
注意:
- 都应该在synchronize代码块中执行,否则会报错,跟内部机制有关系。
- wait的执行时机很重要,一定要确保在其他线程notify之前wait,否则就会出现逻辑问题,一直wait的情况。
- 官方建议判断是否进入等待状态应该在循环中检查(while),而不应该用if判断,原因是底层“伪唤醒”的问题会导致程序执行没有notify或者unpark就被唤醒。
park 和unpark
原理:
利用的是令牌机制,park负责等待,一次消耗一个令牌,unpark负责发令牌,一次发一个,park、unpark没有次序问题,但是要注意一个unpark只能发一个令牌,如果调用了多次park还是会一直等待。
注意:
- unpark需要指定thread对象
LockSupport.park();
LockSupport.unpark(someThread); - park的内部机制不是通过锁的监视,而是直接挂起线程,因此不能放到synchronize代码块中,因为park不会释放锁,这样会导致代码块永远不会被执行。
- 官方建议判断是否进入等待状态应该在循环中检查(while),而不应该用if判断,原因是底层“伪唤醒”的问题会导致程序执行没有notify或者unpark就被唤醒。
网友评论