用java实现死锁,并且判断是否产生

news2024/11/25 21:48:21

目录

锁的概念

锁在多线程环境中的作用是:

在Java中,常见的锁机制有以下几种:

形成死锁的条件

 用java写一个死锁

 如何避免死锁?


锁的概念

 首先我们要明确锁是什么,在Java语言中,锁(Lock)是一种用于控制多个线程对共享资源进行访问的机制。它允许线程以互斥的方式对共享资源进行操作,以避免并发访问引发的数据损坏或不一致性。

简而言之,就是会将资源锁住,然后其他的线程就无法正常调用到该资源

锁在多线程环境中的作用是:

  1. 互斥性(Mutual Exclusion):当一个线程获得锁后,其他线程将无法获得相同的锁,它们将被阻塞并等待直到锁被释放。只有一个线程能够同时获得该锁,从而确保对共享资源的独占访问。

  2. 可见性(Visibility):锁的获取和释放的过程也会导致确保对共享变量的修改在不同线程之间可见。通过使用锁,在释放锁之前,线程将所做的更改刷新到共享内存中,以确保其他线程可以看到这些更改。

在Java中,常见的锁机制有以下几种:

  1. synchronized关键字:用于修饰方法或代码块,可以实现对方法或代码块的互斥访问。

  2. ReentrantLock类:是Java.util.concurrent包中提供的一个可重入锁实现,通过lock()和unlock()方法来控制锁的获取和释放。

  3. ReadWriteLock接口:提供了读-写分离的锁,通过多个读锁可以并发读取,而只有一个写锁可以独占写入。这样可以提高读操作的性能。

锁的正确使用可以保证线程安全,防止竞态条件和数据不一致的问题。然而,错误的锁使用可能导致死锁现象,即多个线程相互等待对方持有的锁,从而导致程序无法继续执行。因此,在多线程编程中,锁的使用需要谨慎,并遵循良好的锁使用规范。

形成死锁的条件

两个或者多个线程相互等待

举一个例子:

线程1先执行上锁A 等待两秒

线程2执行锁住B 等待锁住A之后 释放B 进入等待

线程1停止等待,开始锁B 发现B已经被锁了 进入等待

这样两个线程相互等待对方释放资源才能够继续执行,因此导致了死锁

 用java写一个死锁


public class Test {
    private static final String A = "A";
    private static final String B = "B";

    public static void main(String[] args) {
        new Test().test();
    }
    private void test(){
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (A){
                    try {
                        Thread.sleep(2000);
                        System.out.println("线程休眠结束");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (B){
                        System.out.println("线程1执行完毕!");
                    }
                }
            }
        });
        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (B){
                    System.out.println("B已经被锁住");
                    synchronized (A){
                        System.out.println("线程2执行完毕!");
                    }
                }
            }
        });
        thread1.start();
        thread2.start();
    }
}

在执行之前先看下CPU的状态

 运行代码之后

在发生死锁的情况下,因为涉及到的线程无法继续执行和释放资源,它们可能会一直占用CPU资源,导致CPU利用率的上升。由于线程所占用的资源(如堆栈空间)也无法被释放,这可能会导致内存的占用持续增长,而不会被回收。

之后按下win+r 调出cmd (以管理员身份运行)

输入一下命令查看当前java进程

findstr java.exe

 可以看到当前有两个进程,但是通过这个并不能判断出是哪个进程出现了死锁

通过 一下命令查看这两个进程的详细信息

jstask <pid>

 

 可以看到340这个进程出现了以下信息

 如何避免死锁?

避免一个线程同时获取多个锁。

·避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。

·尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制。

·对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。

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

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

相关文章

think-on-graph: 基于知识图谱的大模型推理

概述 本文的研究背景是大规模语言模型在复杂推理任务中存在困难并展示了较低的性能&#xff0c;特别是在需要知识的追溯能力、及时性和准确性的场景中。 过去的方法主要面临两个问题&#xff1a;推理不负责任容易生成虚构或带有有害文本&#xff0c;以及模型在预训练阶段无法…

个人号的微信API接口,微信机器人二次开发

前段时间应公司需求&#xff0c;要开发一套自定义的微信机器人&#xff0c;具体需求是可以自己批量添加好友、批量打标签等进行好友管理&#xff0c;社群管理需要自动聊天&#xff0c;自动回复&#xff0c;发朋友圈&#xff0c;转发语音&#xff0c;以及定时群发等&#xff0c;…

visio 图片转换到 latex 中

调整图片大小 在Visio中&#xff0c;设计–>页面设置–>大小–>适应绘图&#xff0c;这样会自动去除多余空白&#xff0c;保留部分空白作为边界&#xff0c;无需使用Word。 2. 将新的Visio文件另存为pdf格式文件 3. latex 中插入pdf 格式图片

Python 算法基础篇之数组和列表:创建、访问、添加和删除元素

Python 算法基础篇之数组和列表&#xff1a;创建、访问、添加和删除元素 引用 1. 数组的概念和创建2. 列表的概念和创建3. 访问数组和列表中的元素4. 添加和删除元素 a ) 添加元素 b ) 删除元素 总结 引用 在算法和数据结构中&#xff0c;数组和列表是常见的数据结构&#xff…

MySQL备份与还原/索引/视图

MySQL备份与还原/索引/视图练习 文章目录 一、备份与还原1、使用mysqldump命令备份数据库中的所有表2、备份booksDB数据库中的books表3、使用mysqldump备份booksDB和test数据库4、使用mysqldump备份服务器中的所有数据库5、使用mysql命令还原第二题导出的book表6、进入数据库使…

Spring Cloud+Spring Boot+Mybatis+uniapp+前后端分离实现知识付费平台

Java版知识付费-轻松拥有知识付费平台 多种直播形式&#xff0c;全面满足直播场景需求 公开课、小班课、独立直播间等类型&#xff0c;满足讲师个性化直播场景需求&#xff1b;低延迟、双向视频&#xff0c;亲密互动&#xff0c;无论是互动、答疑&#xff0c;还是打赏、带货、…

简单了解UML类图

前言 大话设计中&#xff0c;多次使用UML类图来表示&#xff0c;并也给了基本的介绍&#xff0c;这里从书中选出UML图和代码做成笔记&#xff0c;以方便查找。 1、类 注意前面的符号&#xff1a; &#xff1a;public -&#xff1a;private #&#xff1a;protected 抽象类&…

华为认证 | 存储专家HCIE-Storage V3.0 正式发布!

华为认证存储专家HCIE-Storage V3.0&#xff08;中文版&#xff09;自2023年7月13日起&#xff0c;正式在中国区发布。 01 发布概述 基于“平台生态”战略&#xff0c;围绕“云-管-端”协同的新ICT技术架构&#xff0c;华为公司打造了覆盖ICT领域的认证体系&#xff0c;包含IC…

秋招LeetCode刷题Day1 -- 前缀树专题

一个人的朝圣 — LeetCode打卡第 天 知识总结 Leetcode 208. 实现 Trie (前缀树)题目说明代码说明 Leetcode 211. 添加与搜索单词 - 数据结构设计题目说明代码说明 Leetcode 648. 单词替换题目说明代码说明 知识总结 今天重新学习了一下前缀树以及相关的知识 Leetcode 208. 实…

2023-07-19 平面坐标下判断三角形以及输出周长和面积

平面坐标下判断三角形以及输出周长和面积 前言一. 基本知识总结 前言 平面坐标下判断三角形以及输出周长和面积, 用线性代数的简单知识. 一. 基本知识 在平面坐标, 三个点就是三个向量, 可以通过两个向量同时减去第三个向量, 形成一个顶点在原点的三角形. 我们发现, 只有一种…

详解C#开发Android应用程序的流程

Android系统一下子铺天盖地而来&#xff0c;让人目不暇接。兴奋的同时也让部分开发人员犯难了&#xff01;要知道从熟知的Wince、Mobile开发语言C#跨越到RFID-Android的Java。可不是一朝一夕就能完成的。就好比你的乾坤大挪移已经第七层了&#xff0c;却忽然要你从易筋经从头练…

LiveGBS流媒体平台GB/T28181功能-报警信息报警订阅配置报警预案告警触发报警时截图及录像

LiveGBS国标GB/T28181报警信息报警订阅配置报警预案告警触发报警时截图及录像 1、报警信息1.1、报警查询1.2、配置开启报警订阅1.2.1、国标设备编辑1.2.2、选择开启报警订阅 1.3、配置摄像头报警1.3.1、配置摄像头报警通道ID1.3.2、配置摄像头开启侦测1.3.3、尝试触发摄像头报警…

Fofa搜索技巧(理论加实践的整理)

目录 题记技巧&#xff08;我一般找国内的&#xff0c;所以下边一直加cn&#xff09;1、搜索HTTP响应头中含有"thinkphp"关键词的网站和IP。2、加上标题带有后台的。3、加上时间&#xff0c;现在新网站有thinkphp日志泄露的有很多。4、搜索html正文中含有"管理…

macboock Air mac系统phpstudy安装php8操作

现在mac的phpstudy的php版本只能到7.3&#xff0c;而有的网站需要8.0以上的版本&#xff0c;那就要手动进行安装 安装后的效果 操作一 安装php8.2的版本 brew install php8.2完成后的地址 /usr/local/Cellar/php/8.2.8 进入/usr/local/Cellar/php/&#xff0c;复制整个文件…

通过监控平台提高运维效率、降低运营成本、实现绿色低碳、节能降耗、提升PUE值-安科瑞黄安南

01引言 近年来&#xff0c;随着母线槽在建筑及工厂的配电中越来越广泛&#xff0c;母线槽场景运用得越多&#xff0c;随着数据中心建设的快速发展和更高需求&#xff0c;智能母线系统逐渐被应用于机房的末端配电中&#xff0c;具有电流小、插接方便、智能化程度高等特点&#…

【深度学习论文阅读】四大分类网络之AlexNet

ImageNet Classification with Deep Convolution Nerual Networks 论文原文&#xff1a;ImageNet Classification with Deep Convolutional Neural Networks 1 引言 解决的问题&#xff1a; 提高效率&#xff08;GPU训练&#xff09;&#xff0c;防止过拟合&#xff08;drop…

VCSEL器件的常见参数有哪些?如何测试?

概述 垂直腔面发射激光器(VCSEL)是一种激光发射方向垂直于P-N结平面,而谐振腔面平行于P-N结平面的半导体激光器,它属于面发射激光器的一种。而EEL边射型激光器的光则是沿着水平方向,由芯片的边缘射出。与EEL相比, VCSEL的生产过程更具经济效益并且响应快,因此在越来越多的应用中…

cocosCreator笔记 之Android打包

版本&#xff1a; v3.4.0 环境&#xff1a; Mac 简介 cocosCreator打包APK包&#xff0c;需要AndroidStudio 4.1版本以上的支持&#xff0c;不支持Eclipse的ANT构建。大概的环境配置&#xff1a; 下载Java SE Development Kit 8 Downloads , 安装JAVA环境下载 Android Studi…

让 AI 真正读懂人类语言,5分钟搞懂 word embedding 技术

大家好啊&#xff0c;我是董董灿。 在学习自然语言处理(NLP&#xff0c;Natural Language Processing)时&#xff0c;最先遇到的一个概念&#xff0c;可能就是词嵌入(word embedding)了。 词嵌入&#xff0c;是让AI真正理解人类自然语言的技术(看完本文再回过头来看这句话&am…

【分布式系统案例课】计数服务之计数服务设计

计数服务如何实现 回顾需求 对于可扩展&#xff1a;对写入的数据进行分区。 对于高性能&#xff1a;借助缓存技术的处理&#xff0c;为了提高吞吐量&#xff0c;需要做批量batch批处理 对于高可靠&#xff1a;不丢数据&#xff0c;需要对数据进行持久化&#xff0c;还要借助复…