多线程05

前言

前面我们说到了死锁以及线程可见性的问题

我们将线程可见性主要归结于是JVM自身的一个bug

一个线程写一个线程读

会将一直不变的变量优化到直接从寄存器中读取,而不是缓存等读取,因为这样我们就设置了使用volatile关键字使得用到这个变量的时候必须从内存中读取数据

死锁主要是四个原因导致:不可抢占,互斥使用,循环等待,请求保持

其中只有循环等待是最好破坏的,我们可以使用规定线程的加锁顺序来破坏这种循环等待的效果

本节我们将讨论wait和notify两个方法的使用 

为什么引入这两个方法,有什么用?

和join方法类似,这两个方法还是用来在应用层面上规定代码的执行顺序,事实上在操作系统内核中线程的调度仍然是无序的

这里的干预其实就是让某个线程主动放弃了去cpu执行的权利,相当于放弃了被调度的机会

举个例子:

此时a线程想去atm中取钱,b线程和c线程想进去存钱,恰好此时a拿到了锁,进去了atm房间

此时a就可以一直占用atm机器等待,加入发现没钱出来,a仍然在行列中竞争锁,所以a一直能持有锁(概率问题,就像我跟你分手了,我们复合的概率更大一样),此情况就称之为线程饿死,因为其他的线程都拿不到锁,执行不了自己的代码

(就是某个线程一直反复获取锁,但是又不执行实质性的逻辑)

wait做了什么??

wait方法实际上是做了三件事情

1.释放锁

2.阻塞等待

3.当其他线程调用notify方法的时候,解除阻塞状态,持有锁之后继续运行代码

join和notify的区别

join方法是指假如在主线程中调用t1.join

此时主线程就会等t1线程执行完才会继续执行

而wait方法除非有线程去唤醒他,他会一直等到枯树开出花

当然,我们也是可以设置wait的最大时间的,也就是等不到结果就直接不等了

产生阻塞的几种原因

join/wait  BLOCKED

sleep       TIMED_WAITING

synchronized BLOCKED

由于wait是object类中的一个方法,所以随便拿个对象都可以使用wait方法,但是得持有锁才行,不然会发生异常

我们一般在synchronized代码块中使用

注:调用wait的对象一般和synchronized的锁一致

一个简单的使用案例

public static void main(String[] args) {//统一对象进行加锁解锁Object lock = new Object();Thread t1 = new Thread(()->{synchronized (lock){System.out.println("t1 wait 之前");try {lock.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("t1 wait 之后");}});Thread t2 = new Thread(()->{synchronized (lock){try {Thread.sleep(5000);System.out.println("notify之前");lock.notify();System.out.println("notify之后");} catch (InterruptedException e) {throw new RuntimeException(e);}}});t1.start();t2.start();}

此时的结果就是,t1线程在执行过打印效果后,会进入阻塞状态,然后t2睡眠5000ms之后会执行一次打印动作,然后让t1解除阻塞状态,最后执行完下一次打印后释放锁

注:notify方法只会唤醒阻塞的线程,并不会释放锁

注:wait和notify方法是成套使用的,两者依靠对象联系起来

假如这里我们使用object1对象来wait这个线程

再使用objcet2是唤不醒这个线程的

多线程知识点小结

1.线程的特性,线程和进程的区别

2.Thread类创建线程的几种方式

3.Thread类的一些属性

4.启动线程

5.终止线程

6.等待线程

7.线程休眠

8.获取线程引用

9.线程状态

10.线程安全问题

        10.1 线程安全产生的原因及解决方法

        10.2 死锁问题

        10.3 内存可见性问题

11.线程的wait和notify...

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

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

相关文章

项目终验的exce表格缩放,排版等经常使用

xxx个项目的验收资料 1.申请表等等很多信息 需求:放在一页内等办法 上述文档,在excel表格打印预览中都是在两页中,很难调节,这个时候采用wps专业版本即可。 wps排版经常使用的功能如下: 经常使用的是 1.把所有列打印…

const 和 constexpr 深入学习

在 C 中,const 和 constexpr 都可以用来修饰对象和函数。修饰对象时,const 表示它是常量,而 constexpr 表示它是一个常量表达式。常量表达式必须在编译时期被计算1。修饰函数时,const 只能用于非静态成员的函数,而 con…

WPF窗口样式的比较

WPF窗口样式的比较 1.WPF默认Window窗口 带有图标 标题栏 最小最大化推出按钮 <Window x:Class"GlowWindowDemo.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006…

nginx: [alert] could not open error log file

先把cmd的报错信息粘出来 nginx: [alert] could not open error log file: CreateFile() “logs/error.log” failed (3: The system cannot find the path specified) 2023/11/29 11:27:37 [emerg] 5040#18772: CreateDirectory() “D:\enviroment\nginx-1.24.0\conf/temp/cli…

Linux学习笔记09、Shell命令之历史命令和自动补全

上一篇&#xff1a;Linux学习笔记08、Shell命令之常用命令缩写及全称 目录 1、历史命令&#xff1a; 1.1、查看所有历史命令列表&#xff1a; 1.2、查看指定历史命令&#xff1a; 1.3、清除历史命令&#xff1a; 2、自动补全 2.1、当字符串唯一时&#xff1a; 2.2、当有多个…

力扣题:字符的统计-11.25

力扣题-11.25 [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 力扣题1&#xff1a;387. 字符串中的第一个唯一字符 解题思想&#xff1a;直接遍历即可 class Solution(object):def firstUniqChar(self, s):""":type s: str:rtype: int""&qu…

机器学习——决策树

1.决策树 2.熵&#xff08;不确定程度&#xff09; 3.信息增益 & 信息增益比 3.1 信息增益 & 信息增益比 的 概念 3.2 案例解释说明 &#xff13;.&#xff12;.&#xff11;数据集说明 &#xff13;.&#xff12;.&#xff12;计算 &#xff14;&#xff0e;&#x…

智能井盖传感器怎么监测井盖出现倾斜?

智能井盖传感器是一种先进的智能设备&#xff0c;能够二十四小时连续监测井盖是否出现倾斜。其工作原理主要是依靠内置的传感器&#xff0c;以及搭载的MEMS“芯”技术。便于智能井盖传感器实时感知到井盖的姿态变化&#xff0c;一旦发现有倾斜的现象&#xff0c;就会立即向运维…

Jmeter之压力测试总结!

一、基本概念 1.线程组N&#xff1a;代表一定数量的并发用户&#xff0c;所谓并发就是指同一时刻访问发送请求的用户。线程组就是模拟并发用户访问。 2.Ramp-Up Period(in seconds)&#xff1a;建立所有线程的周期&#xff0c;就是告诉jmeter要在多久没启动所有线程&#xff…

python+pytest接口自动化(5)-requests发送post请求

简介 在HTTP协议中&#xff0c;与get请求把请求参数直接放在url中不同&#xff0c;post请求的请求数据需通过消息主体(request body)中传递。 且协议中并没有规定post请求的请求数据必须使用什么样的编码方式&#xff0c;所以其请求数据可以有不同的编码方式&#xff0c;服务…

elasticsearch安装分词器插件

查看插件安装情况 elasticsearch-plugin list 插件在线安装 bin/elasticsearch-plugin install analysis-icu 离线安装ik分词 cd plugins wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.17.7/elasticsearch-analysis-ik-7.17.7.zip unzi…

Wireshark之Intro, HTTP, DNS

源码地址&#x1f447; moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES: 《计算机网络&#xff0d;自顶向下方法(原书第6版)》编程作业&#xff0c;Wireshark实验文档的翻译和解答。 (github.com) 目录 &#x1f33c;Introduce &#x1f3a7;前置 &#x1f3a7;过…

智能电子墨水屏价签系统版

无线2.4G通信&#xff0c;加密的交流&#xff0c;穿透力强&#xff0c;不惧障碍 自定义双向通信协议&#xff0c;安全可靠 海量模板随意切换&#xff0c;模板也可自行DIY设计 远程批量管理&#xff0c;多店铺管理 超低功耗&#xff0c;常规可持续使用5年 工作温度范围&…

[新人向]MySQL和Navicat下载、安装及使用详细教程

MySQL和Navicat下载和安装及使用详细教程 因为这些软件的安装很多都是纯英文&#xff0c;作为新手安装真的需要摸索好久&#xff0c;包括我自己&#xff0c;所以Pipi酱就把自己的经验分享给大家~ MySQL的安装教程 一、下载安装包链接&#xff1a; 1.下载MySQL&#xff1a;ht…

Python MD5加密的三种方法(可加盐)

方法一&#xff1a;MD5直接加密 import hashlibtext1123456 print(text1) mdhashlib.md5(text1.encode()) # 创建md5对象 md5pwdmd.hexdigest() # md5加密 print(md5pwd) 输出结果&#xff1a; 方法二&#xff1a;MD5盐加密&#xff0c;将盐拼接在原密码后 import ha…

开源生成式AI初创平台together.ai,获7.3亿元融资

11月30日&#xff0c;开源生成式AI平台Together AI在官网宣布&#xff0c;获得1.025亿美元&#xff08;约7.3亿元&#xff09;A轮融资。本次由凯鹏华盈 (Kleiner Perkins) 领投&#xff0c;英伟达、Emergence Capital、 NEA、Prosperity 7、Greycroft等跟投。 公开资料显示&am…

样品实验Oxfilm351CN高沸点低VOC成膜助剂TDS说明书

样品实验Oxfilm351CN高沸点低VOC成膜助剂TDS说明书 1KG/瓶

Windows核心编程 HOOK

目录 HOOK概述 HOOK API SetWindowsHookExA 函数(winuser.h) UnhookWindowsHookEx 函数(winuser.h) NextHookEx 函数(winuser.h) 局部钩子 全局钩子 为什么全局钩子需要用dll作为过程函数&#xff1f; HOOK概述 本质&#xff1a;Windows消系统的消息过滤器。 全局钩子…

嵌入式常见的几种接口

嵌入式开发中&#xff0c;常见的外设通信接口/协议有SPI&#xff0c;I2C&#xff0c;UART三种&#xff0c;本文先分三个部分对SPI&#xff0c;I2C&#xff0c;UART进行介绍&#xff0c;最后对这三种协议进行比较。 1 SPI 1.1 SPI的简介 SPI&#xff08;Serial Peripheral …

SAP S/4HANA 中的业务合作伙伴概念

原文地址&#xff1a;https://blogs.sap.com/2023/07/16/business-partner-concept-in-sap-s-4hana/ 1.1 什么是业务合作伙伴&#xff1f; 在 SAP S/4 HANA 中&#xff0c;业务合作伙伴是维护业务合作伙伴、客户和供应商&#xff08;以前称为供应商&#xff09;主数据的主…