多线程知识笔记(四)-----volatile、wait方法、notify方法

news2024/11/27 0:19:45

文章目录

  • 1、volatile关键字
  • 2、volatile和synchronized对比
  • 3、wait和notify方法

1、volatile关键字

先看例子:


 class Counter {
    public int flag = 0;
}

public class Test4{
    public static void main(String[] args) {
        Counter counter = new Counter();
        Thread t1 = new Thread(() -> { //创建一个线程,用来读取数据
            while (counter.flag == 0) {
            }
            System.out.println("循环结束!");
        });
        
        Thread t2 = new Thread(() -> {   //建立一个线程用来修改数据
            Scanner scanner = new Scanner(System.in);
            System.out.println("输入一个整数:");
            counter.flag = scanner.nextInt();
        });
        t1.start();
        t2.start();
    }

}

结果:
在这里插入图片描述
我们输入了一个非零的数字,理论上应该直接打印“循环结束”,线程t1就结束了,可是实际上却没有这样,这也是一个典型的线程安全问题!
在这里插入图片描述

内存可见性问题:
一个线程对一个变量进行读取操作,另一个线程对变量进行修改,但是此时读取到的值不一定是修改后的值,这个读线程就不能准确的感知变量的变化,所以此时就需要使用volatile这个关键字来避免这种情况
在这里插入图片描述

注意:volatile只能修饰变量
不能修饰构造方法内部的局部变量因为方法里的局部变量只能在当前方法里使用,出了方法 变量就没了,方法内部的变量在“栈”空间上,每个线程都有自己的“栈空间”,即使是同一个方法在多个线程中备点用,这里的局部变量也会处在不同的栈空间中,本质上是不同变量。

小知识:
1.CPU读取寄存器的速度比读取内存快了很多,因此CPU内部引入缓存cache,寄存器存储空间小,速度快,但是很贵;中间搞了个cache:存储空间居中,读写速度居中,成本居中。
2.工作内存:CPU寄存器+CPU的cache。当CPU要读取一个内存数据的时候,可能从内存读,也可能从cache读,也可能从寄存器读。
3.有的CPU可能没有cache,有的有一个cache,还可能有多个,现在的CPU普遍是3级cache,L1,L2,L3…


2、volatile和synchronized对比

1、 volatile 和 synchronized 有着本质的区别.,synchronized 能够保证原子性, volatile 保证的是内存可见性
2、 synchronized 既能保证原子性, 也能保证内存可见性.

3、wait和notify方法

因为线程的抢占式执行,导致实际开发中有太多的不可能性,因此java中就有wait和notify这两个方法来控制线程的执行顺序。
例如:t1和t2两个线程,我们希望t1先执行,执行到某个程度让t1wait阻塞,接着让t2执行,等t2执行完之后,再用notify来唤醒t1线程继续执行。
问题:为什么不可以用join或者sleep来控制呢?
使用join就必须等t1全部执行完才能让t2执行,使用sleep,无法估计t1执行到哪个程度来唤醒t2;
但是使用wait和notify就可以完美的解决上述问题。
在这里插入图片描述

在这里插入图片描述

也就是说,如果没有明确说明是哪个对象的,notify就会随机挑一个正在wait的线程进行通知;
看代码:通过代码就可以看出该方法的好处:

public class Test2 {
    public static void main(String[] args) {
            Object locker1 = new Object();//创建对象1
            Object locker2 = new Object();//创建对象2
            Thread t1 = new Thread(() -> {
                synchronized (locker2){   //锁2等待
                    try {
                        locker2.wait();
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
                System.out.println("a");

            });
            Thread t2 = new Thread(() -> {
                synchronized (locker1){  //锁1等待
                    try {
                        locker1.wait();
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
                System.out.println("b");
                synchronized (locker2){  //锁2解锁
                    locker2.notify();
                }
            });
            Thread t3 = new Thread(() -> {
                System.out.println("c");
                synchronized (locker1){//锁1解锁
                    locker1.notify();
                }
            });

            t1.start();
            t2.start();
            t3.start();
    }
}

结果:
在这里插入图片描述
在这里插入图片描述

通过上面这个例子,我们可以看到通过wait和notify的使用来控制a、b、c的打印顺序。

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

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

相关文章

如何使用Footrace 钱包监控功能和设置自定义的交易警报

2022-06-12 本文将介绍如何使用 Footrace 监控 CEX 的钱包地址并设置自定义警报。 什么是 Footrace? Footrace (Foot Trace) 是一个多链的钱包追踪监控平台,可以监控CEX、DEX、鲸鱼、聪明钱、或任何你想关注的地址的钱包。 Footrace 帮助投资者保护他…

有了这几个软件安全测试工具,编写安全测试报告再也不愁

软件的安全是开发人员、测试人员、企业以及用户共同关心的话题,尤其是软件产品的使用者,因为系统中承载着用户的个人信息、人际互动、管理权限等各类隐私海量关键数据。软件安全测试工作不仅是为了用户,更牵扯到许多的利益共同体。因此软件安…

2854-40-2,环二肽cyclo(Pro-Val)

Component of coffee flavor 咖啡香精成分 在烘焙咖啡中检测到Cyclo(Pro-Val)和其他含pro的二酮哌嗪类化合物。这些化合物的含量随着烘焙强度的增加而增加,它们增加了苦味。这种味道苦涩的环二肽也在可可、巧克力、牛肉和奶酪等其他食品中被检测到。Cyclo(Pro-Val)显…

Linux物理内存管理——会议室管理员如何分配会议室

之前学习了站在内存的角度去看内存,看到的都是虚拟内存,这些虚拟内存总是要映射到物理页面的,这一篇文章来学习物理内存是如何管理的。 物理内存的组织方式 之前学习虚拟内存的时候,当涉及物理内存的映射的时候,总是…

不会还有人不知道如何搭建【关键字驱动自动化测试框架】吧 ?

前言 这篇文章我们将了解关键字驱动测试又是如何驱动自动化测试完成整个测试过程的。关键字驱动框架是一种功能自动化测试框架,它也被称为表格驱动测试或者基于动作字的测试。关键字驱动的框架的基本工作是将测试用例分成四个不同的部分。首先是测试步骤&#xff0…

MobileNet网络模型(V1,V2,V3)

MobileNet网络中的亮点:DW卷积,增加了两个超参数,控制卷积层卷积核个数的α,控制输入图像大小的β,这两个超参数是我们人为设定的,并不是学习到的。BN batch normal批规范化,为了加快训练收敛速…

大数据MapReduce学习案例:数据去重

文章目录一,案例分析(一)数据去重介绍(二)案例需求二,案例实施(一)准备数据文件(1)启动hadoop服务(2)在虚拟机上创建文本文件&#xf…

大数据MapReduce学习案例:TopN

文章目录一,案例分析(一)TopN分析法介绍(二)案例需求二,案例实施(一)准备数据文件(1)启动hadoop服务(2)在虚拟机上创建文本文件&#…

linux把乱码文件(非文件内容)删除(Xshell中使用rz命令上传文件出现乱码,删除乱码文件)的步骤讲解

我的场景是:首先安装lrzsz:yum install lrzsz,然后后使用rz -be上传文件出现乱码问题,想要把乱码文件删除 圆圈圈出来的就是乱码文件,横线划线出来的是使用rm命令删除但是无效 解决方法是:ls | grep -v ‘…

人人都是数据分析师

一.耳熟能详的数据你真的了解吗? 1.数据的类型 根据数据的存储形式,可以将数据分为结构化数据和非结构化数据两种类型 存储在数据库中的结构化数据能够很方便地进行检索、分析以及展示分析结果。结构化数据是进 行数据分析的基本类型,大多数…

【1697. 检查边长度限制的路径是否存在】

来源:力扣(LeetCode) 描述: 给你一个 n 个点组成的无向图边集 edgeList ,其中 edgeList[i] [ui, vi, disi] 表示点 ui 和点 vi 之间有一条长度为 disi 的边。请注意,两个点之间可能有 超过一条边 。 给…

(附源码)springboot建达集团公司平台 毕业设计 141538

springboot建达集团公司平台 摘 要 随着互联网大趋势的到来,社会的方方面面,各行各业都在考虑利用互联网作为媒介将自己的信息更及时有效地推广出去,而其中最好的方式就是建立网络管理系统,并对其进行信息管理。由于现在网络的发…

DAMOYOLO:基于DAMOYOLO训练数据集详细教程

前段时间yolov7的推出引起一篇热潮,接着rmyolo紧跟潮流,后面阿里的达摩院也推出了自己的yolo算法,怎么说呢,damoyolo推出依旧不少天了,现在才写博客,因为damoyolo给我的体验感不是很好。 先看下DAMOYOLO的…

安科瑞模拟信号隔离器BM-DIS/I 经2000V隔离输出DC4-20mA 二线制

安科瑞 王晶淼/刘芳 1.信号隔离器功能 BM系列模拟信号隔离器可以对电流、电压等电量参数或温度、电阻等非电量参数进行高速精确测量,经隔离转换成标准的模拟信号输出。既可直接与指针表、数显表相接,也可以与自控仪表(如PLC)、各…

nginx负载均衡实战练习

1、简介 nginx是一个web服务器,反向代理服务器、开源并且高性能,社区里面有很多工程师在维护这个项目。可以在官网(Index of /download/)下载组件。而且nginx可以用来做流量转发,也是是负载均衡功能,分散单…

160. 相交链表

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意,函数返回结果后…

富而喜悦一年一渡专属于你的特别的礼物!快来收!

过去的一年,你过得怎么样?是否有过艰难的逆流时刻,是否拥有过快乐和满足,又是否得到了成长和收获?富而喜悦2023一年一渡财富流新年主题活动就要给你一个礼物多多!美美的“礼物”活动! 为此&…

虹科分享 | 虹科Dimetix激光测距传感器如何利用反射来测量?(上)

-01-测量原理 ● 反射调制激光 采用激光振幅的高频调制,并评估这些调制的高频信号(脉冲串)的相位和距离。激光束在短间隔内被放大调制,这使得它能够非常迅速地测量单个脉冲包的与距离有关的时间偏移,而且还能测量单个波在调制包内相互之间的…

[附源码]Nodejs计算机毕业设计基于Web学术会议投稿管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分…

Ims开机注册流程

目录 概述Ims注册时序图PhoneApp的启动过程Ims注册主要代码总结概述 IMS(IP Multimedia Subsystem)是IP多媒体系统, 是一种新的多媒体业务形式,ims service 结构主要包括 ImsService、ImsManager、MmTelFeatureConnection、ImsCallSession。其中: ImsS…