美文网首页
wait() notify() notifyAll()讲解

wait() notify() notifyAll()讲解

作者: 3517a85fd522 | 来源:发表于2018-12-21 12:59 被阅读0次

    1.锁池 等待池

    每个对象都内置了锁池跟等待池。
    锁池: 某个线程拥有了该对象的锁,其他线程执行时,遇到该对象修饰的synchronized方法时,会去获取该对象锁的拥有权,由于线程A已经拥有了锁的拥有权,因此其余线程进入到该对象的锁池中。
    等待池:线程A调用该对象的wait方法时,线程A会释放该对象的锁,进入该对象的等待池中。

    wait方法必须在synchronized方法或者synchronized块中使用,当调用到wait方法时,该线程肯定已经获取到了锁。

    wait notify使用

    //JDK官方给出的使用建议
    synchronized (obj) {
                  while (条件不满足)
                      obj.wait(timeout);
                  ... // Perform action appropriate to condition
              }
    

    wait notify notifyAll 概念理解

    wait nootify

    wait join区别理解

    join:当前线程让出CPU,进入等待池中,直到子线程执行完毕。
    join源码解读。
    下面是Join源码,发现实际上join是通过wait实现的。

    public final synchronized void join(long millis)
        throws InterruptedException {
            long base = System.currentTimeMillis();
            long now = 0;
    
            if (millis < 0) {
                throw new IllegalArgumentException("timeout value is negative");
            }
    
            if (millis == 0) {
                while (isAlive()) {
                    wait(0);
                }
            } else {
                while (isAlive()) {
                    long delay = millis - now;
                    if (delay <= 0) {
                        break;
                    }
                    wait(delay);
                    now = System.currentTimeMillis() - base;
                }
            }
        }
    
    public static void main(String[] args) throws InterruptedException {
            Thread t1 = new Thread(new Thread1(1),"thread1....");
            Thread t2 = new Thread(new Thread2(2),"thread2....");
            t1.start();
            t1.join();
            t2.start();
           t2.join();
        }
    

    上面的可以t1.join可以认为如下,就是t1执行完之后,main继续执行,启动t2,执行完之后,继续执行main线程,知道main线程执行结束。

    synchronized (t1){
                while (t1.isAlive()){
                    t1.wait();
                }
            }
    

    wait: 将当前线程挂起,并释放锁,进入等待池中。

    wait sleep区别理解

    sleep: sleep会让当前线程进入休眠状态,但是不会释放锁,休眠解锁会再次获取CPU资源重新运行。

    相关文章

      网友评论

          本文标题:wait() notify() notifyAll()讲解

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