美文网首页
多线程之wait和notify

多线程之wait和notify

作者: mundane | 来源:发表于2022-03-10 19:25 被阅读0次

    彻底搞懂Java的等待-通知(wait-notify)机制
    https://achang.blog.csdn.net/article/details/122790061
    并发编程——线程中sleep(),yield(),join(),wait(),notify(),notifyAll()区别

    先上一个代码例子再来理解,两个线程交替打印:

    public class Test1 {
        //共享对象,用来实现对象锁
        static final Object object = new Object();
    
        public static void main(String[] args) {
    
            Thread t1 = new Thread(() -> {
                while (true) {
                    synchronized (object) {
                        try {
                            TimeUnit.MILLISECONDS.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println(Thread.currentThread().getName() + "执行");
                        object.notify();
                        try {
                            object.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
    
    
            }, "t1");
    
    
            Thread t2 = new Thread(() -> {
                while (true) {
                    synchronized (object) {
                        try {
                            TimeUnit.MILLISECONDS.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println(Thread.currentThread().getName() + "执行");
                        object.notify();
                        try {
                            object.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
    
            }, "t2");
            t1.start();
            t2.start();
    
        }
    }
    

    运行结果:

    t1执行
    t2执行
    t1执行
    t2执行
    t1执行
    t2执行
    t1执行
    t2执行
    t1执行
    t2执行
    t1执行
    ...
    

    结论:
    wait():使调用该方法的线程释放共享资源锁,然后从运行状态退出,进入等待队列,直到被再次唤醒
    notify():随机唤醒等待队列中等待同一共享资源的一个线程,并使该线程退出等待队列,进入可运行状态,也就是notify()方法仅通知一个线程。
    notifyAll():使所有正在等待队列中等待同一共享资源的全部线程退出等待队列,进入可运行状态。此时,优先级最高的那个线程最先执行,但也有可能是随机执行,这取决于JVM虚拟机的实现。
    1.锁池
    所有需要竞争同步锁的线程都会放在锁池当中,比如当前对象的锁已经被其中一个线程得到,则其他线程需要在这个锁池进行等待,当前面的线程释放同步锁后锁池中的线程去竞争同步锁,当某个线程得到后会进入就绪队列进行等待cpu资源分配。
    2.等待池
    当我们调用wait()方法后,线程会放到等待池当中,等待池的线程是不会去竞争同步锁。只有调用了notify()或notifyAll()后等待池的线程才会开始去竞争锁。
    notify()是随机从等待池选出一个线程放到锁池,而notifyAll()是将等待池的所有线程放到锁池当中

    相关文章

      网友评论

          本文标题:多线程之wait和notify

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