java api 线程通信

多线程通讯的api:

wait 和notify、notifyAll

原理:
wait的实现原理是利用对象的等待队列,执行的时候会给锁的对象的等待队列加一条,执行的时候会释放当前锁,让其他线程正常调用锁对象。

注意:

  1. 都应该在synchronize代码块中执行,否则会报错,跟内部机制有关系。
  2. wait的执行时机很重要,一定要确保在其他线程notify之前wait,否则就会出现逻辑问题,一直wait的情况。
  3. 官方建议判断是否进入等待状态应该在循环中检查(while),而不应该用if判断,原因是底层“伪唤醒”的问题会导致程序执行没有notify或者unpark就被唤醒。
park 和unpark

原理:
利用的是令牌机制,park负责等待,一次消耗一个令牌,unpark负责发令牌,一次发一个,park、unpark没有次序问题,但是要注意一个unpark只能发一个令牌,如果调用了多次park还是会一直等待。

注意:

  1. unpark需要指定thread对象
    LockSupport.park();
    LockSupport.unpark(someThread);
  2. park的内部机制不是通过锁的监视,而是直接挂起线程,因此不能放到synchronize代码块中,因为park不会释放锁,这样会导致代码块永远不会被执行。
  3. 官方建议判断是否进入等待状态应该在循环中检查(while),而不应该用if判断,原因是底层“伪唤醒”的问题会导致程序执行没有notify或者unpark就被唤醒。

你可能感兴趣的:(java api 线程通信)