当前位置: 首页 > news >正文

JavaWeb11-死锁

目录

1.死锁定义

1.1.代码演示

1.2.使用jconsole/jvisualvm/jmc查看死锁

①使用jconsole:最简单。

②使用jvisualvm:(Java虚拟机)更方便,更直观,更智能,更高级,是合适的选择。

③使用jmc:加载的资源更多,需要的时间更长,最高级。

2.死锁产生原因

①互斥条件

②不可被剥夺条件

③请求并持有条件

④环路等待条件

3.如何解决死锁问题?

解决死锁方案1:破环请求并持有条件

解决死锁方案2:破坏环路等待条件/使用顺序锁


1.死锁定义

死锁是指两个或两个以上的执行单元(进程/线程/协程(Java中没有协程的概念)在执⾏过程中,由于竞争资源或者由于彼此通信⽽造成的⼀种阻塞的现象,若⽆外⼒作⽤,它们都将⽆法推进下去。

也就是两个进程/线程/协程拥有锁的情况下,⼜在尝试获取对⽅锁,从⽽造成程序⼀直阻塞的情况。

一个线程可以拥有多把锁,但一把锁同一时间只能被一个线程所占用。

1.1.代码演示

import java.util.concurrent.TimeUnit;/*** 死锁示例*/
public class Thread18 {public static void main(String[] args) {Object lockA = new Object();Object lockB = new Object();Thread t1 = new Thread(() -> {//1.占有一把锁(锁A)synchronized (lockA){System.out.println("线程1:获得锁A");//因为线程的执行是不可控的。中间设置空档期,休眠1s,让线程2有时间先占有锁B(线程1得到锁B的速度不能大于线程2得到锁B的速度)try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}//2.尝试获取线程2的锁Bsynchronized (lockB){System.out.println("线程1:获得锁B");}}});t1.start();Thread t2 = new Thread(() -> {//1.占有一把锁(锁B)synchronized (lockB){System.out.println("线程2:获得锁B");//休眠1s(保证线程1有充足的时间得到锁A)try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}//2.尝试获取线程1的锁Asynchronized (lockA){System.out.println("线程2:获得锁A");}}});t2.start();}
}

1.2.使用jconsole/jvisualvm/jmc查看死锁

①使用jconsole:最简单。

②使用jvisualvm:(Java虚拟机)更方便,更直观,更智能,更高级,是合适的选择。

都在同一级目录。

③使用jmc:加载的资源更多,需要的时间更长,最高级。

2.死锁产生原因

①互斥条件

⼀个资源(锁)同一时间只能被⼀个线程占有,当这个资源被占⽤之后其他线程就只能等待。

②不可被剥夺条件

当⼀个线程不主动释放资源时,此资源⼀直被拥有线程占有。

③请求并持有条件

线程已经拥有了⼀个资源之后,又尝试请求新的资源。

④环路等待条件

产⽣死锁⼀定是发⽣了线程资源环形链。

这四个因素(缺一不可)共同导致了死锁。

3.如何解决死锁问题?

改变死锁中的任意⼀个或多个条件就可以解决死锁的问题,其中可以被修改的条件只有后两个:请求并持有条件环路等待条件(人为控制,可被打破,可被修改);前两个条件都是系统设定的。

解决死锁方案1:破环请求并持有条件

import java.util.concurrent.TimeUnit;/*** 解决死锁方案:破环请求并持有条件*/
public class UnDeadLock1 {public static void main(String[] args) {Object lockA = new Object();Object lockB = new Object();Thread t1 = new Thread(() ->{synchronized (lockA){System.out.println("线程1:得到了锁A");//业务代码...try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {}
//                synchronized (lockB){
//                    System.out.println("线程1:得到了锁B");
//                    //业务代码...
//                    System.out.println("线程1:释放了锁B");
//                }System.out.println("线程1:释放了锁A");}},"线程1");t1.start();Thread t2 = new Thread(() ->{synchronized (lockB){System.out.println("线程2:得到了锁B");//业务代码...try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {}
//                synchronized (lockA){
//                    System.out.println("线程2:得到了锁A");
//                    //业务代码...
//                    System.out.println("线程2:释放了锁A");
//                }System.out.println("线程2:释放了锁B");}},"线程2");t2.start();}
}

解决死锁方案2:破坏环路等待条件/使用顺序锁

import java.util.concurrent.TimeUnit;/*** 解决死锁方案:破坏环路等待条件*/
public class UnDeadLock2 {public static void main(String[] args) {Object lockA = new Object();Object lockB = new Object();Thread t1 = new Thread(() ->{synchronized (lockA){System.out.println("线程1:得到了锁A");//业务代码...try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {}synchronized (lockB){System.out.println("线程1:得到了锁B");//业务代码...System.out.println("线程1:释放了锁B");}System.out.println("线程1:释放了锁A");}},"线程1");t1.start();Thread t2 = new Thread(() ->{synchronized (lockA){System.out.println("线程2:得到了锁A");//业务代码...try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {}synchronized (lockB){System.out.println("线程2:得到了锁B");//业务代码...System.out.println("线程2:释放了锁B");}System.out.println("线程2:释放了锁A");}},"线程2");t2.start();}
}

相关文章:

JavaWeb11-死锁

目录 1.死锁定义 1.1.代码演示 1.2.使用jconsole/jvisualvm/jmc查看死锁 ①使用jconsole:最简单。 ②使用jvisualvm:(Java虚拟机)更方便,更直观,更智能,更高级,是合适的选择。 …...

堆的概念和结构以及堆排序

前言 普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结 构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统 虚拟进程地址空间中的堆是两回事&#xff0c…...

【Linux学习笔记】1.Linux 简介及安装

前言 本章介绍Linux及其安装方法。 Linux 简介 Linux 内核最初只是由芬兰人林纳斯托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的。 Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 UNIX 的多…...

代码练习2~

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。def …...

微信小程序 之 云开发

一、概念1. 传统开发模式2. 新开发模式 ( 云开发模式 )3. 传统、云开发的模式对比4. 传统、云开发的项目流程对比5. 云开发的定位1. 个人的项目或者想法,不想开发服务器,直接使用云开发2. 某些公司的小程序项目是使用云开发的,但是不多&#…...

程序员的三门课,学习成长笔记

最近是有了解到一本好书,叫做程序员的三门课在这本书的内容当中我也确实汲取到了很多前辈能够传达出来的很多关于程序员职业规划以及成长路线上的见解,令我受益匪浅,故此想要把阅读完的每一章节结合自己的工作经验做一个精细化的小结&#xf…...

[技术经理]01 程序员最优的成长之路是什么?

00前言 谈起程序员的职业规划,针对大部分的职场人士,最优的成长之路应该是走技术管理路线,而不是走技术专家路线。 01关键的一步 中国自古就有“学而优则仕”的传统,发展到今天,在我们的现代企业里面,尤…...

linux集群技术(三)--七层负载均衡-nginx

nginx特点nginx优势、缺点生产架构nginx 7层负载均衡语法示例nginx负载均衡算法测试案例生产案例 1.nginx特点 1. 功能强大,性能卓越,运行稳定。 2. 配置简单灵活。 3. 能够自动剔除工作不正常的后端服务器。 4. 上传文件使用异步模式。client---nginx---web1 web2 web3 lvs同…...

阿里云物联网平台设备模拟器

在使用阿里云物联网平台过程中,如果开始调试没有实际的物理设备,可以考虑在阿里云物联网平台使用官方自带的模拟器进行调试。不过也可以通过叶帆科技开发的阿里云物联网平台设备模拟器AliIoTSimulator进行调试,AliIoTSimulator可以独立运行&a…...

docker全解

目录说明docker简介为什么是docker容器与虚拟机比较容器发展简史传统虚拟机技术容器虚拟化技术docker能干什么带来技术职级的变化开发/运维(Devops)新一代开发工程师Docker应用场景why docker?docker的优势docker和dockerHub官网Docker安装CentOS Docker…...

Vue3 基础

Vue3 基础 概述 Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面&…...

【Linux】冯.诺依曼体系结构与操作系统

环境:centos7.6,腾讯云服务器Linux文章都放在了专栏:【Linux】欢迎支持订阅🌹冯.诺依曼体系结构什么是冯诺依曼体系结构?我们如今的计算机比如笔记本,或者是服务器,基本上都遵循冯诺依曼体系结构…...

WSO2 apim 多租户来区分api

WSO2 apim 多租户来区分api1. Tenant1.1 Add new tenant1.2 Add Role/User1.3 Published Api2. Delete Teant3. AwakeningWSO2安装使用的全过程详解: https://blog.csdn.net/weixin_43916074/article/details/127987099. Official Document: Managing Tenants. 1. Tenant 1.1 …...

TodoList(Vue前端经典项目)

TodoList主要是包含了CRUD功能,本地存储功能(loaclStorage)总结:全选按纽可以通过forEach循环来讲数据中的isCheck中的false删除实现就通过传递id,然后根据filter循环将符合条件的数据返回成数组,然后将返回…...

【扫盲】数字货币科普对于完全不了解啥叫比特币的小伙伴需要的聊天谈资

很多人并不清楚,我们时常听说的比特币,以太坊币,等等这些东西到底是一场骗局还是一场货币革命? 下面就围绕这数字货币的历史以及一些应用场景开始分析这个问题。 一、 开端 一切从2008年中本聪(Satoshi Nakamoto&…...

算法学习笔记:双指针

前言: 用于记录总结刷题过程中遇到的同类型问题 双指针问题及用法总结 1. 总结 双指针常用于遍历连序性对象(如数组、链表等)时,使用两个或多个指针进行单向遍历及相应的操作。避免多层循环,降低算法的时间复杂度。 …...

C++类的静态成员总结

tags: C OOP 引子: 类为什么需要静态成员 有时候类需要与它的一些成员与类本身直接相关, 而不是与类的各个对象都保持关联, 这就减少了成员与每一个类的实例对象的联系, 从而降低资源占用. 另一方面, 如果每次都需要重新更新该成员, 使得对象使用新的值, 这时候只需要修改一份…...

二、并发编程的三大特性

文章目录并发编程的三大特性1、原子性什么是并发编程的原子性?保证并发编程的原子性synchronizedCASLock锁ThreadLocal2、可见性什么是可见性?解决可见性的方式volatilesynchronizedLockfinal3、有序性什么是有序性?as-if-serialhappens-beforevolatile并发编程的…...

Ubuntu 22.04.2 LTS安装Apollo8.0

本人硬件环境: CPU:Intel Core i7 6700 显卡(GPU):NVIDIA GTX 3080 10G 内存:SAMSUNG DDR4 32GB 硬盘:双SSD系统盘 2T,双系统(windows,ubuntu) 一、安装Ubuntu 22.04…...

提高转化率的 3 个客户引导最佳实践

如果您的试用客户没有转化为付费客户,或者您总体上正在努力解决试用到付费转化率,那么您来对地方了。本文的最终目标是向您展示一些可用于提高自己的激活率和整体试用到付费转化的最佳客户引导实践。SaaS公司目前生活在一个以产品为主导的增长时代。换句…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

快刀集(1): 一刀斩断视频片头广告

一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...

day36-多路IO复用

一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...

离线语音识别方案分析

随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...