【Java|多线程与高并发】wait和notify方法详解

这篇具有很好参考价值的文章主要介绍了【Java|多线程与高并发】wait和notify方法详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.前言

在Java多线程环境中,线程之间是抢占式执行的,线程的调度是随机的.这就很难受了. 在很多情况下我们希望线程以我们想要的顺序来执行. 这就需要waitnotify这两个方法

【Java|多线程与高并发】wait和notify方法详解

2.wait和notify的基本使用

首先是wait方法
【Java|多线程与高并发】wait和notify方法详解
wait是Object类的方法,而Java中的类都是间接或直接继承于Object类. 因此只要是类的实例都可以调用wait方法

运行上述代码:
【Java|多线程与高并发】wait和notify方法详解
可以看到这里抛出了一个 非法的锁状态异常

其实wait方法的执行分为三步:

  1. 释放当前锁
  2. 进行等待通知
  3. 满足一定的条件(其它线程调用notify),被唤醒,然后重新获取锁

什么要先释放锁,再进行等待通知呢?

因为wait如果不释放锁,可能会影响到其它线程的执行,就是为了保证不影响其它线程的执行

因此wait与锁密不可分
【Java|多线程与高并发】wait和notify方法详解
对上述代码进行加锁,就不会抛出异常了.

但上述代码的执行并没有结束,因为线程在调用wait方法之后,会一直处于阻塞状态,直到有其它线程调用notify方法为止.
而调用notify方法的线程要和调用wait方法的线程是针对同一个对象进行加锁的才行.

示例:

    public static void main(String[] args) {
        Object object = new Object();
        Thread t1 = new Thread(() ->{
            while(true){
                synchronized (object){
                    System.out.println("wait 之前");
                    try {
                        object.wait();
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    System.out.println("wait 之后");
                }
            }
        });
        t1.start();
        Thread t2 = new Thread(() ->{
            while(true){
                synchronized (object){
                    System.out.println("notify 之前");
                    object.notify();
                    System.out.println("notify 之后");
                }
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        t2.start();
    }

运行截图:
【Java|多线程与高并发】wait和notify方法详解
上述标注的是一组 waitnotify方法的执行流程.

注: 如果先调用的是notify方法,代码并不会有什么影响.

3. notifyAll方法

Java中除了使用notify方法唤醒线程,还有一个notifyAll方法.
当一个线程调用了某个对象的notifyAll方法后,该对象上的所有等待线程将被唤醒,即使唤醒了所有在等待的线程,这些线程之间也要进行锁竞争(串行执行)。

4. wait和sleep方法的对比

wait方法和sleep方法的对比也是面试中经常会问到的问题

对于这个问题,可以从相同点和不同点进行回答:

相同点: 都是让线程进入阻塞等待状态
不同点:sleep方法是通过时间来通知唤醒,而wait方法则需要使用notify或notifyAll进行唤醒

5. 总结

waitnotify方法用于实现线程间的协作和通信.
wait方法使线程进入等待状态,notify方法唤醒一个等待线程,notifyAll方法唤醒所有等待线程。
通过上述三个方法,可以使线程按照特定的顺序执行或者等待某个条件满足后再执行。

【Java|多线程与高并发】wait和notify方法详解

感谢你的观看!希望这篇文章能帮到你!
专栏: 《从零开始的Java学习之旅》在不断更新中,欢迎订阅!
“愿与君共勉,携手共进!”
【Java|多线程与高并发】wait和notify方法详解文章来源地址https://www.toymoban.com/news/detail-499121.html

到了这里,关于【Java|多线程与高并发】wait和notify方法详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java中wait和notify详解

    线程的调度是无序的,随机的,但是也是有一定的需求场景,希望能够有序执行,join算是一种控制顺序的方式(功能有限)——》一个线程执行完,才能执行另一个线程! 本文主要讲解的:wait和notify则有一下功能: wait:就是让某个线程先暂停下来,等一等 notify:就是把该

    2024年02月09日
    浏览(32)
  • 【Java|多线程与高并发】线程安全问题以及synchronized使用实例

    Java多线程环境下,多个线程同时访问共享资源时可能出现的数据竞争和不一致的情况。 线程安全一直都是一个令人头疼的问题.为了解决这个问题,Java为我们提供了很多方式. synchronized、ReentrantLock类等。 使用线程安全的数据结构,例如ConcurrentHashMap、ConcurrentLinkedQueue等

    2024年02月09日
    浏览(44)
  • 多线程中的wait和notify

    由于线程之间是抢占式执行的,所以线程之间的执行先后顺序难以预知。但实际上是希望合理的协调多个线程之间的执行先后顺序。  完成这个协调工作,主要涉及到三个方法 *wait()/wait(long timeout);让当前线程进入等待状态。 *notify()/notifyAll();唤醒在当前对象上等待的线程。

    2024年02月10日
    浏览(45)
  • 【Java|多线程与高并发】JUC中常用的类和接口

    JUC是Java并发编程中的一个重要模块,全称为 Java Util Concurrent (Java并发工具包),它提供了一组用于多线程编程的工具类和框架,帮助开发者更方便地编写线程安全的并发代码。 本文主要介绍 Java Util Concurrent 下的一些常用接口和类 Callable接口类似于Runnable. 有一点区别就是

    2024年02月12日
    浏览(32)
  • 【JavaEE初阶】多线程(三)volatile wait notify关键字 单例模式

    摄影分享~~ 以上代码运行的结果可能是输入1后,t1这个线程并没有结束。而是一直在while中循环。而t2线程已经执行完了。 以上情况,就叫做 内存可见性问题 这里使用汇编来理解,大概分为两步操作: load,把内存中flag的值,读到寄存器中。 cmp,把寄存器中的值,和0进行比

    2023年04月25日
    浏览(38)
  • 【Java|多线程与高并发】设计模式-单例模式(饿汉式,懒汉式和静态内部类)

    设计模式是一种在软件开发中常用的解决复杂问题的方法论。它提供了一套经过验证的解决方案,用于解决特定类型问题的设计和实现。设计模式可以帮助开发人员提高代码的可重用性、可维护性和可扩展性。 设计模式有很多,本文主要介绍单例模式. 单例模式是一种创建型设

    2024年02月11日
    浏览(53)
  • 多线程与高并发--------线程池

    在开发中,为了提升效率的操作,我们需要将一些业务采用多线程的方式去执行。 比如有一个比较大的任务,可以将任务分成几块,分别交给几个线程去执行,最终做一个汇总就可以了。 比如做业务操作时,需要发送短信或者是发送邮件,这种操作也可以基于异步的方式完

    2024年02月13日
    浏览(38)
  • 多线程与高并发——并发编程(4)

    1.1 生产者消费者概念 生产者-消费者是设计模式的一种,让生产者和消费者基于一个容器来解决强耦合的问题。生产者与消费者彼此之间不会直接通讯,而是通过一个容器(队列)进行通讯。 生产者生产完数据后扔到容器中,不用等消费者来处理; 消费者也不需要去找生产

    2024年02月10日
    浏览(46)
  • 多线程与高并发——并发编程(5)

    为什么要使用线程池? 在开发中,为了提升效率,我们需要将一些业务采用多线程的方式去执行。比如,有一个比较大的任务,可以将任务分成几块,分别交给几个线程去执行,最终做一个汇总即可。再比如,做业务操作时,需要发送短信或邮件,这些操作也可以基于异步的

    2024年02月09日
    浏览(43)
  • 多线程与高并发--------阻塞队列

    1.1 生产者消费者概念 生产者消费者是设计模式的一种。让生产者和消费者基于一个容器来解决强耦合问题。 生产者 消费者彼此之间不会直接通讯的,而是通过一个容器(队列)进行通讯。 所以生产者生产完数据后扔到容器中,不通用等待消费者来处理。 消费者不需要去找

    2024年02月13日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包