美文网首页
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