美文网首页
java api 线程通信

java api 线程通信

作者: 瓢鳍小虾虎 | 来源:发表于2020-12-29 09:23 被阅读0次

    多线程通讯的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 线程通信

          本文链接:https://www.haomeiwen.com/subject/zfntoktx.html