美文网首页
多线程之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()是将等待池的所有线程放到锁池当中

相关文章

  • java api 线程通信

    多线程通讯的api: wait 和notify、notifyAll 原理:wait的实现原理是利用对象的等待队列,...

  • wait/notify

    JAVA线程同步中wait()和notify()简洁例子 java中的wait(),notify(),notify...

  • Java多线程核心技术笔记2

    wait和notify wait和notify必须在synchronize方法或synchronize块中使用 调...

  • Java 多线程工具类

    notify wait wait()、notify()和notifyAll()是Object类中的native f...

  • 进程与线程

    注意: 多线程可以提高CPU利用率,不能提高内存利用率 进程 wait()、notify()和notifyAll(...

  • java多线程(2)-线程同步与线程安全

    前言 前面我们在java多线程相关(1)-synchronized,wait,notify,volatile中简单...

  • why java

    为什么wait()和notify()方法是在Object类中,不在Thread类中wait()和notify() ...

  • 多线程(二)、内置锁synchronized

    前言 在上一篇 多线程(一)、基础概念及notify()和wait()的使用 文章中我们讲了多线程的一些基础概念...

  • 003-- wait和notify的理解与使用

    话题一:对于wait()和notify()的理解 对于wait()和notify()的理解,还是要从jdk官方文档...

  • Java多线程notify()和wait()

    基本10家公司面试,7家都会考多线程~~我们直接看下面的代码↓↓↓↓ 从代码看很简单,就是thread2先启动线程...

网友评论

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

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