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

目录

锁的概念

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

在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() {@Overridepublic 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() {@Overridepublic 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.hqwc.cn/news/29037.html

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

相关文章

餐饮行业油烟监控管理系统设计与应用

安科瑞 华楠 摘 要&#xff1a;餐饮油烟污染问题已经成为城市环境污染的重要污染源&#xff0c;本研究的油烟在线监测数据管理信息系统是油烟在线监测数据采集仪的配套软件&#xff0c;用于展现现场端数据采集仪采集的数据&#xff0c;对数据采集仪进行远程控制&#xff0c;以…

vue3+vite配置 unplugin-vue-component 找不到 Vant 组件的问题

使用 vue3 vite Vant 搭建移动端项目&#xff0c;为了避免全量引入 vant 导致打包体积过大&#xff0c;又不想一个一个组件手动导入&#xff0c;所以就选择了 vant 官方推荐的方法&#xff0c;使用 unplugin-vue-components 插件自动引入组件&#xff0c;并按需引入组件的样式…

2023.7.15排序算法合集

排序算法合集 一、概述二、排序算法1.冒泡排序2.插入排序3.选择排序4.快速排序5.归并排序6.计数排序 三、完整源码 一、概述 排序算法是计算机科学中的一类常见算法&#xff0c;用于将一组数据按照特定的顺序进行排列&#xff1b;排序算法的应用非常广泛&#xff0c;涉及到数据…

【iOS】对象的本质探索

OC对象的底层结构 问题&#xff1a;一个NSObject对象在内存中是如何布局的&#xff1f;NSObject的内存布局1 通过 lldb命令 窥探NSObject内存布局2 通过 View Memory 窥探NSObject内存布局3 通过 底层函数API 窥探NSObject内存布局总结 通过继承关系进一步了解NSObject1 运行项…

智慧数据驱动:基于smardaten构建多维数据可视化大屏

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

【DC-DC】APS54083 降压恒流驱动器大功率深度调光 舞台 RGB 汽车照明 台灯驱动芯片

产品描述 APS54083 是一款 PWM 工作模式,高效率、外围简单、外置功率 MOS 管&#xff0c;适用于 5-220V 输入高精度降压 LED 恒流驱动芯片。输出最大功率150W最大电流 6A。APS54083 可实现线性调光和 PWM 调光&#xff0c;线性调光脚有效电压范围 0.5-2.5V.PWM 调光频率范围 1…

算法训练营第四十三天||● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

● 1049. 最后一块石头的重量 II 这道题和昨天的分割等和子集一样&#xff0c;只是最后返回值不一样 class Solution { public:int lastStoneWeightII(vector<int>& stones) {int sum 0;for(int i 0;i<stones.size();i){sum stones[i];}int target sum / 2;…

喝汽水问题:1瓶汽水1元。2个空瓶可以换1瓶汽水,给20元,可以买多少汽水 (7.19)

泪目&#xff01;&#xff01;&#xff01;终于是自己完完整整写出的代码了&#xff0c;不翻资料也没看参考代码 &#xff08;之前的要么和老师练习&#xff0c;要么找教材东拼西凑&#xff09; 方法2&#xff1a;数学角度看bottle价值0.5 元&#xff0c;20元最多可换40bottl…

docker服务启动过程分析

How docker.service start&#xff1f; just by ref 我们先了解docker的各个核心组件的介绍 runc&#xff1a;runc实现了容器的底层功能&#xff0c;例如创建、运行等。runc通过调用内核接口为容器创建和管理cgroup、namespace等Linux内核功能&#xff0c;来实现容器的核心特…

vuecli5.x 配置图片输出为base64

解释&#xff1a;webpack的默认配置是小于一定的文件大小就要将图片转为base64, 所以尽量将这个阈值调大你的图片就可以转为base64; 当然这种做法不好, 会导致代码文件变大, 不过为了满足需求也没得办法。这年头大家都用 vite 了, 网上没有 vuecli5.x 这方面的记录, 写篇文章记…

Halcon 深度学习初探

什么是深度学习&#xff1f; 深度学习是一系列机器学习的方法集合&#xff0c;其算法结构类似于多层级的神经网络。通过对大量的训练样本图像的学习&#xff0c;提取其各个层次的特征&#xff0c;使网络具有判别和推理能力。 关于halcon中的深度学习&#xff1a; 自halcon17…

【C语言】文件操作

目录 前言&#xff1a; 一、为什么使用文件 二、什么是文件 &#xff08;一&#xff09;程序文件 &#xff08;二&#xff09;数据文件 &#xff08;三&#xff09;文件名 三、文件的打开和关闭 &#xff08;一&#xff09;文件指针 &#xff08;二&#xff09;文件的…