多线程死锁,java内存模型,wait、notify方法

死锁出现的第一种情况

   可重入

    同一个线程针对同一个锁连续继续加锁多次的行为。如果发生了死锁情况,那就是发生了不可重入,反之不会发生死锁,就是可重入的。

当进行多次加锁会发生什么情况

    

在这个方法中实现了在外面对方法的加锁(当一旦运行这个方法时,运行这个方法的线程立刻加锁),又在内部实现了对this对象也就是对自身的加锁对这个线程的加锁。在外层加锁时因为此时这个线程没有人加锁,所以加锁会成功,在内部实行加锁时(以前所学认为锁只能加一次),因为锁已经加了,想要在加锁必须等待方法调用时加的锁解开才能进行加锁。现在内部想要加锁就要等待调用方法时加的锁解开,想要解开锁就要让这个方法运行完,但是现在这个方法内部又要进行加锁,方法不能运行完。这一多次加锁加不上的线现象就认为是死锁。为了解决这一问题就将synchronized设计为可以进行多次加锁的可重入锁。这可以使上述的情况不会出现死锁情况。

实现

可重入锁的内部,会记录当前的锁被哪个线程占用的,也会记录加锁次数,比如当线程a对自己进行第一次加锁时,内部会记录为线程a加锁次数1,然后线程a在进行加锁时就只是将加锁的次数由1改变为2来进行统计加锁的次数,此时没有真正的进行加锁,只是伪加锁,后续在进行解锁的时候由于只是进行的伪加锁所以只将次数减一就好,直至减到0时,才真正进行锁的解开。这一实现降低了使用成本,提高了开发效率,但提高了程序维护线程时的开销(维护哪个线程被锁,锁了几次)降低了运行效率。

死锁出现的其他情况

  N个线程,M把锁

  哲学家就餐问题

桌子上有五根筷子,五个哲学家,当他们想要吃饭的时候,必须要同时拿两根筷子才可以。我们规定当想要吃饭的时候,先拿左边的筷子,再拿右边的筷子。同时如果想吃饭的时候如果自己不能同时拿到两根筷子就会一直等其他哲学家吃完之后再拿起来吃饭,在这样的情况下如果他们同时拿起左边的筷子就会进入一个死锁的情况他们会一直等待下去。要解决这样类似的问题,只能先将筷子进行排序然后在那个在最小序号筷子旁边的人先同时拿两个筷子,然后按照筷子的顺序,在他们旁边的依次拿一根筷子,等待最小序号吃完之后将筷子方下就可以解决这样类似的死锁问题。

我们知道了什么情况下会产生死锁,总结这些情况发现死锁产生的必要条件

互斥使用:一个锁被一个线程占用之后,其他线程不能占用。

不可抢占:一个锁被一个线程占用之后,其他线程不能把这个锁给抢走。

请求和保持:当一个线程占据了多把锁之后,除非显式的释放锁,否则这些锁始终都是该线程持有的。

环路等待:等待关系成为一个循环。A等B,B等C,C又等A。

上述这些必要条件中第一条和第三条是锁的基本特性,我们想要避开锁在日常开发中,只能从第四个条件进行入手,在设计时约定好针对多把锁加锁时,有固定的顺序,使其不能成环。当然在日常开发中一般也不经常出现嵌套着使用锁,如果出现这种情况一定要规定好锁的属性。

java的内存模型(JMM Java Memory Model

JMM是将内存寄存器等硬件在java中用术语重新封装实现了一遍。

工作内存(work memory):CPU寄存器,不是平常说的内存。

主内存(main memory):平常所提及的内存

这两者组成了JMM,因为java是一个跨平台的语言,所以要将计算机中运算的组件封装起来,如果某个计算机中没有上述的硬件也可以运行。

wait notify  方法

   作用:用来处理调度的随机性问题,让线程之间有一个固定的顺序。这两种方法都是Object对象的方法,一调用wait方法的线程,线程立刻就会陷入阻塞。阻塞到有其他线程通过使用notify方法来唤醒线程。

单独使用wait或者notfy方法会发生这样的报错,因为在使用wait时其内部在进行三件事,先释放锁,等待其他线程的通知,收到通知后,重新获取锁,在往下执行。所以使用时就要搭配着synchronized来进行加锁。

从输出结果可以看出其处于线程thread处于阻塞中。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

操作系统的理解|冯·若依曼体系结构|进程的状态

操作系统的理解 冯诺伊曼体系结构为什么必须通过内存然后到cpu存储金字塔冯诺伊曼结构的改进在哪?我们可不可以全部用寄存器来做存储器在硬件数据流动角度学以致用:解释程序运行为什么要加载到内存程序没被运行之前存在哪里? 操作系统概念广义…

快速熟悉ElasticSearch的基本概念

1.全文检索 全文检索是通过文本内容进行全面搜索的技术。通过全文检索可以快速地在大量文本数据中查找包含特定关键词或者短语的文档,并且返回相关的搜索结果。 检索和查询的区别 检索没有搜索条件边界,检索的结果取决于相关性,相关性计算…

下载安装anaconda和pytorch的详细方法,以及遇到的问题和解决办法

下载安装Anaconda 首先需要下载Anaconda,可以到官网Anaconda官网或者这里提供一个镜像网站去下载anaconda镜像网站 安装步骤可参考该文章:Anaconda安装步骤,本篇不再赘述 注意环境变量的配置,安装好Anaconda之后一定要在环境变量…

Apache Hive的部署与体验

一、Apache Hive概述 什么是分布式SQL计算? 以分布式的形式,执行SQL语句,进行数据统计分析。Apache Hive是做什么的? 很简单,将SQL语句翻译成MapReduce程序,从而提供用户分布式SQL计算的能力。传统MapRed…

碳实践|企业组织碳排放源识别方法、案例分析,及注意事项

在上一章中讲到“界、源、算、质、查”五步法实现企业组织碳的完整核算流程,本章将针对其中的“源”- “识别排放源”这一步骤来展开,主要分析其识别方法、实操案例,并列举注意事项。 企业识别碳排放源是指在组织边界内找到产生碳排放的设施,…

python--函数的参数问题

1.函数的参数: 默认值参数:通过定义函数时,将可能调用时不怎么变化的参数,给定默认值,在调用时方便调用 注意:位置参数不能写在默认值参数后边 可变参数(不定长参数):在开…

mysql日志管理 、备份与恢复

目录 一 MySQL 日志 (一),日志位置 (二)配置文件中 与日志相关的代码 1,错误日志 2,通用查询日志 3,二进制日志(binlog) 4,中继日志 5,慢查询日志…

国内ip地址随意更换的潜在风险和策略

在数字化时代,IP地址是互联网通信的基础,而国内IP地址的随意更换可能带来一系列安全风险和问题。虎观代理小二将探讨国内IP地址随意更换的潜在影响以及如何有效应对这一挑战。 1.什么是国内IP地址? 国内IP地址是指在国内分配和使用的IP地址&…

企事业单位如何判断第三方软件测试机构的专业性和可信度?

第三方软件测试机构,指的是独立于被测试软件开发者和用户的中立测试机构。它们承担着对软件进行全面测试和评估的任务,以确保软件的质量和稳定性。那么,企事业单位在选择时应怎样判断一个第三方软件测试机构的专业性和可信度呢? 一个专业的…

Data.olllo解密:秒数转换为日期格式的神奇技能!

引言: 时间是数据世界中不可或缺的一环,而将秒数转换为易读的日期格式往往是数据处理中的一大挑战。但是,有了Data.olllo,这一任务将变得异常简单! 功能介绍: Data.olllo的秒数转换功能可以让您轻松地将秒…

小折叠手机如何经久耐用?收下这份日常养护指南

不同于普通手机的玻璃屏幕,折叠机出于折叠的特性,使用了柔性屏幕。因此撕除原厂保护膜时,由于贴膜较强的粘合力,很容易就会导致屏幕产生不可修复的损伤。 这也是为什么各大手机厂商都不允许折叠机私自贴膜的原因,并且…

C++ 迭代器与反向迭代器

目录 一,什么是迭代器 1,定义 2,迭代器的设计思维 3,迭代器种类 二,迭代器与容器 1,容器中的迭代器 2,迭代器失效问题 三,迭代器的类型萃取(traits) …

动态多态的注意事项

大家好: 衷心希望各位点赞。 您的问题请留在评论区,我会及时回答。 多态的基本概念 多态是C面向对象三大特性之一(多态、继承、封装) 多态分为两类: 静态多态:函数重载和运算符重载属于静态多态&#x…

程序员35岁会失业吗?这事儿其实没那么简单!

35岁被认为是程序员职业生涯的分水岭,许多程序员开始担忧自己的职业发展是否会受到年龄的限制。有人担心随着年龄的增长,技术更新换代的速度会使得资深程序员难以跟上;而另一些人则认为,丰富的经验和深厚的技术积累是年轻程序员无…

基于WTVXXX-32SS智能门锁后板锁方案

一:简介 随着用户认知和生活习惯的改变,消费者对构建便捷生活和智能家居系统的诉求持续增多,智能门锁作为智能家居的门面和典型的物理级入口,成为打造全屋智能必不可少的环节。随着智能门锁行业规模的不断提升,产品的生…

2024南京人工智能展会:定于2024年11月份在南京国际博览中心举行

2024南京国际人工智能展览会,拟定于2024年11月份在南京国际博览中心隆重召开。这一盛大的科技盛宴,无疑将为全球人工智能领域注入新的活力,推动科技创新与社会进步。 此次展览会将以“智能未来,共创辉煌”为主题,汇聚全…

IDEA中快速配置Git

Git介绍: Git下载 idea中配置Git

淘宝app商品数据API接口|item_get_app-获得淘宝app商品详情原数据

获得淘宝app商品详情原数据 API返回值说明 item_get_app-获得淘宝app商品详情原数据 公共参数​​​​​​ 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地…

低代码开发平台开源:提升效率,轻而易举!

当前,数字化转型与社会高速发展都是人们肉眼可见的发展趋势。作为中小企业,如何在激烈的市场竞争中脱颖而出?如何赢得话语权和主动权,从而提升市场竞争力?这就需要考虑引进更为先进和专业的办公利器了。低代码开发平台…

【Java程序设计】【C00379】基于(JavaWeb)Springboot的旅游服务平台(有论文)

【C00379】基于(JavaWeb)Springboot的旅游服务平台(有论文) 项目简介项目获取开发环境项目技术运行截图 博主介绍:java高级开发,从事互联网行业六年,已经做了六年的毕业设计程序开发&#xff0c…