zoukankan      html  css  js  c++  java
  • Java精通并发-wait与notify及线程同步系统总结

    notifyAll():

    在上两次中对于Object的wait()和notify()方法的官方doc进行了通读,上一次https://www.cnblogs.com/webor2006/p/11407966.html读了notify()的说明,接下来再来读一下notifyAll()方法的说明,先看下它的声明,也是native的:

    开始逐字解读:

    从上面描述可以看到,其实它跟notify()方法的作用是差不多的,只是该方法是唤醒所有的线程,但是注意:唤醒的线程是不会立马执行的,需要跟普通的其它线程进行相等的锁竞争才行,竞争到了才能继续执行

    wait()&notify()&notifyAll()总结:

    • 当调用wait()时,首先需要确保调用了wait()方法的线程已经持有了对象的锁。
    • 当调用wait()后,该线程就会释放掉这个对象的锁,然后进入到等待状态(wait set)。
    • 当线程调用了wait()后进入到等待状态时,它就可以等待其它线程调用相同对象的notify和notifyAll方法来使得自己被唤醒。
    • 一旦这个线程被其它线程唤醒后,该线程就会与其它线程一同开始竞争这个对象的锁(公平竞争),只有当该线程获取到了这个对象的锁后,线程才会继续往下执行。
    • 调用wait()方法的代码片段需要放在一个synchronized或或者是synchronized方法中,这样才可以确保线程在调用wait()方法前已经获取到了对象的锁。
    • 当调用对象的notify()方法时,它会随机唤醒该对象等待集合(wait set)中的任意一个线程,当某个线程被唤醒后,它就会与其它线程一同竞争对象的锁。
    • 当调用对象的notifyAll()方法时,它会唤醒该对象等待集合(wait set)中的所有线程,这些线程被唤醒后,又会开始竞争对象的锁。
    • 在某一时刻,只有唯一一个线程可以拥有对象的锁。
  • 相关阅读:
    JavaWeb--HttpSession案例
    codeforces B. Balls Game 解题报告
    hdu 1711 Number Sequence 解题报告
    codeforces B. Online Meeting 解题报告
    ZOJ 3706 Break Standard Weight 解题报告
    codeforces C. Magic Formulas 解题报告
    codeforces B. Sereja and Mirroring 解题报告
    zoj 1109 Language of FatMouse 解题报告
    hdu 1361.Parencodings 解题报告
    hdu 1004 Let the Balloon Rise 解题报告
  • 原文地址:https://www.cnblogs.com/webor2006/p/11422293.html
Copyright © 2011-2022 走看看