【JAVAEE】使用wait()方法和notify()方法解决线程不安全中的有序性问题

news2024/11/18 17:48:40

目录

1.wait()方法

2.notify()方法

3.notifyAll()方法

4.wait()和sleep()方法的区别


由于线程之间是抢占式执行的,因此线程之间执行的先后顺序难以预知。但是在实际开发中有时候我们希望合理的协调多个线程之间的执行先后顺序。

完成这个协调工作,主要涉及三个方法。

wait()/wait(long timeout):让当前线程进入等待状态

notify()/notifyAll():唤醒在当前对象上等待的线程

wait()方法,notify()方法和notifyAll()方法都是Object类的方法。

1.wait()方法

wait():让线程等待一段时间,没有时间限制

wait(long):让线程等待一段时间,有时间限制的等待,指定的时间到了就不等了

wait做的事情:

  • 使当前执行代码的线程进行等待(把线程放到等待队列中)
  • 释放当前的锁
  • 满足一定条件时被唤醒,重新尝试获取这个锁

wait要搭配synchronized来使用,脱离synchronized使用wait会直接抛出异常。

wait结束等待的条件:

  • 其它线程调用该对象的notify方法
  • wait等待时间超市
  • 其它线程调用该等待线程的interrupted方法,导致wait抛出interruptedException异常

join()和wait()方法的区别:

join()方法的作用也是让线程去等待。二者的不同之处在于:

  • join()是让调用方去等,wait()是让执行方去等
  • join()是Thread类中定义的方法,wait和notify是Object类中定义的方法

用一个场景来演示一下join,wait,notify的功能:

2.notify()方法

notify():唤醒等待中的一个线程,直接参与锁竞争

如果有多个线程等待,则由线程调度器随机挑选出一个呈wait状态的线程(不存在”先来后到“)

在notify()方法后,当前线程不会马上释放该对象锁,要等到执行notify()方法的线程将程序执行完,也就是同步代码块之后才会释放对象锁。

示例代码:

package com.bitejiuyeke.lesson04;

/**
 * @Author 比特就业课
 * @Date 2023-05-05
 */
public class Demo31_Wait_Notify {

    private static Object locker = new Object();

    public static void main(String[] args) {
        // 买包子线程
        Thread t1 = new Thread(() -> {
            while (true) {
                System.out.println(Thread.currentThread().getName() + " wait 之前");
                try {
                    // 等待资源,线程会被阻塞
                    synchronized (locker) {
                        locker.wait();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + " wait 之后");
                System.out.println("=============================");
            }
        }, "t1");
        // 启动线程
        t1.start();

        // 包子铺老板线程
        Thread t2 = new Thread(() -> {
            while (true) {
                System.out.println(Thread.currentThread().getName() + " notify 之前");
                // 唤醒时也使用同一个锁对象
                synchronized (locker) {
                    locker.notify();
                }
                System.out.println(Thread.currentThread().getName() + " notify 之后");
                // 等待一会
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "t2");
        // 启动线程
        t2.start();
    }
}

3.notifyAll()方法

notifyAll():唤醒等待中的全部线程,线程共同去参与锁竞争

4.wait()和sleep()方法的区别

1.本质上来说都是让线程阻塞等待,但是两个方法没有什么关系

2.wait是Object类中定义的方法,sleep是Thread类中定义的方法

3.wait必须和synchronized搭配使用,调用之后会释放锁,sleep只是让线程进入休眠和锁没有关系

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/502908.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QML之HTML5画布移植(Porting from HTML5 Canvas)

移植一个HTML5画布图像到QML画布非常简单。在成百上千的例子中,我们选择了一个来移植。 螺旋图形(Spiro Graph) 我们使用一个来自Mozila项目的螺旋图形例子来作为我们的基础示例。原始的HTML5代码被作为画布教程发布。 下面是我们需要修改…

OpenGL(十)——基础光照

目录 一、前言 二、环境光照 三、漫反射光照 3.1 法向量 3.2顶点着色器 3.3 VAO属性解释 3.4 片段着色器 四、镜面光照 4.1 片段着色器 一、前言 现实世界光照十分复杂,冯氏光照模型是对现实世界光照的抽象,主要由3部分组成,环境amb…

【JAVAEE】使用synchronized关键字和volatile关键字解决线程安全问题中的原子性,内存可见性和有序性问题

目录 1.synchronized关键字---监视器锁monitor lock 1.1synchronized的特性 互斥 刷新内存 可重入 1.3synchronized使用注意事项 2.volatile关键字 2.1volatile保证内存可见性问题 MESI缓存一致性协议 内存屏障 2.2volatile解决有序性问题 3.总结synchronized和vola…

ELK -- kibana 用nginx代理后无法访问

背景: 本地搭建好elk后,一切正常,后面改成用nginx代理kibana的5601端口,发现代理后无法正常访问(未代理的地址可正常访问),花了很多时间去查问题,报错基本都是http://ip:port/spaces…

Leetcode刷题之复制带随机指针的链表

生命不是安排,而是追求,人生的意义也许永远没有答案,但也要尽情感受这种没有答案的人生。 --弗吉尼亚. 伍尔芙 目录 前言: 🌸一.复制带随机指针的链表 🌅1.复制结点链接到原本链表每一个结点的…

24个强大的HTML属性,每个资深Web工程师都应该掌握!

HTML 属性非常多,除了基本的一些属性外,还有很多很有用的功能性特别强大的属性; 本文将介绍24个强大的HTML属性,这些属性可以让你的网站更加动态和交互,让用户感到更加舒适和愉悦。 让我们一起来探索这24个强大的HTML…

进程优先级+环境变量++地址空间+虚拟地址空间

索引 一.进程优先级二.环境变量1.通过代码如何获取环境1.通过第三个命令行参数获得2.根据第三方变量environ获取3.通过系统调用获取环境变量 2.验证环境变量可以被子进程继承下去 三.验证地址空间1.验证程序地址空间2.证明地址空间不是物理地址 四.虚拟地址空间虚拟地址空间存在…

BI财务智能分析,让企业管理更上一层楼

智能财务建设既可以看作是财务管理工作在经济社会数字化转型的全面开启,也可以看作是财务职能在以数字化技术为支撑,形成对内提升单位管理水平和风险管控能力、对外服务财政管理和宏观经济治理的会计职能拓展,究其本质则是在财务数字化转型升…

简单介绍之隔离级别与分布式事务

一,分布式系统与环境问题 概念 系统可以笼统分为集中式系统和分布式系统。 集中式系统就是由一台或多台主计算机组成中心节点,系统所有功能均由其集中处理。 分布式系统是硬件和软件组件分布不同的网络计算机上,彼此之间仅仅通过消息传递进…

植被参数光学遥感反演方法(Python)及遥感与生态模型数据同化算法技术应用

传统的地面实测方法能够得到比较准确的植被参数(如叶面积指数、覆盖度、生物量、叶绿素、干物质、叶片含水量、FPAR等),但其获取信息有限,难以满足大范围提取植被参数的需求,尤其在异质地表区域。遥感技术的发展为植被…

C++学习day--07 字符串

1、黑客攻击系统-用户输入的优化 第 1 节 项目需求 1. 用户登录时&#xff0c;用户可能输入很长的用户名。 2. 使用 char 类型和 int 类型&#xff0c;表示用户名和密码&#xff0c;不安全。 第 2 节 项目实现 #include <iostream> #include <Windows.h> …

MacBook重置与推荐软件配置

Mac OS 12.6.5 前言重置初始化配置说明 GitJava 8 & Maven & MysqlJava 8mavenMySQL配置 MotrixDBeaver添加aliyun的maven至DBeaver添加MySQL VS CodeSteamTyporaiStas Menus 前言 用了一年的机械革命游戏本,机器加外设20斤的重量背过几次出门后就再也不想带出门了,运行…

PyYaml反序列化漏洞

0x01 HDCTF 遇到预期解是考的yaml了&#xff0c;前来学习下 语法 语法就不贴了&#xff0c;其他文章有介绍 语法和 yml配置文件的 语法差不多 就不一一介绍 漏洞成因与利用 PyYaml < 5.1 在python 中 pyyaml是提供 python 和Yaml 两种语言的转换&#xff0c;与pickle 类…

C++20协程

简介 ​ C20协程只是提供协程机制&#xff0c;而不是提供协程库。C20的协程是无栈协程&#xff0c;无栈协程是一个可以挂起/恢复的特殊函数&#xff0c;是函数调用的泛化&#xff0c;且只能被线程调用&#xff0c;本身并不抢占内核调度。 ​ C20 提供了三个新关键字(co_await…

【DRF配置管理】如何建立swagger风格api接口文档

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 DRF应用和管理 【DRF配置管理】Django安装和使用DRF框架 【DRF配置管理】如何在视图函数配置参数(一) 【DRF配置管理】如何在视图函数配置参数(二) 【…

C. Enlarge GCD(内存的限制 + 数组的访问速度)

Problem - C - Codeforces Mr. F 有 n 个正整数 a1,a2,…,an。 他认为这些整数的最大公约数太小了。所以他想通过删除其中一些整数来扩大它。 但是这个问题对他来说太简单了&#xff0c;所以他不想自己做。如果你帮他解决这个问题&#xff0c;他会给你一些奖励分数。 你的任…

AntDB数据库携手金蝶Apusic应用服务器, 共促信创产业繁荣发展

日前&#xff0c;湖南亚信安慧科技有限公司&#xff08;简称&#xff1a;亚信安慧&#xff09;与深圳市金蝶天燕云计算股份有限公司&#xff08;简称&#xff1a;金蝶天燕&#xff09;完成AntDB数据库与金蝶Apusic服务器软件V9.0、V10产品的兼容互认&#xff0c;兼容性良好&…

不是吧,3 : 00 面试,还没10分钟就出来了,问的也太...

从外包出来&#xff0c;没想到死在另一家厂子 自从加入这家公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到2月一纸通知&#xff0c;所有人不许加班&#xff0c;薪资直降30%&#xff0c;顿时有吃不起饭的赶脚。 好在有个兄弟内推我去…

Android WebRtc+SRS/ZLM视频通话(3):安装ZLMediaKit

Android WebRtcSRS/ZLM视频通话&#xff08;3&#xff09;&#xff1a;安装ZLMediaKit 来自奔三人员的焦虑日志 接着上一章内容&#xff0c;继续来记录ZLMediaKit的安装&#xff0c;这里的ZLMediaKit实际上和SRS的功能差不多&#xff0c;都是国内流媒体服务框架使用人数比价多&…

【SpringBoot】MyBatis与MyBatis-Plus分页查询问题

笔者写这篇博客是因为近期遇到的关于两者之间的分页代码差距&#xff0c;其实之前也遇见过但是没有去整理这篇博客&#xff0c;但由于还是被困扰了小一会儿时间&#xff0c;所以还是需要加深记忆。其实会看前后端传参解决这个问题很快、不麻烦。关于这两个框架的分页代码问题主…