Java线程死锁

ops/2024/10/17 22:23:41/

在Java中,线程死锁通常发生在两个或更多个线程相互等待对方释放资源的情况下。以下是一个简单的Java示例,展示了如何创建线程死锁:

public class DeadlockDemo {// 定义两个资源private static Object resource1 = new Object();private static Object resource2 = new Object();// 线程1private static class Thread1 extends Thread {public void run() {synchronized (resource1) {System.out.println("Thread 1: Got resource 1");// 模拟一些耗时操作try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}// 尝试获取resource2,此时可能导致死锁System.out.println("Thread 1: Waiting for resource 2");synchronized (resource2) {System.out.println("Thread 1: Got resource 2");}}}}// 线程2private static class Thread2 extends Thread {public void run() {synchronized (resource2) {System.out.println("Thread 2: Got resource 2");// 模拟一些耗时操作try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}// 尝试获取resource1,此时可能与线程1发生死锁System.out.println("Thread 2: Waiting for resource 1");synchronized (resource1) {System.out.println("Thread 2: Got resource 1");}}}}public static void main(String[] args) {// 启动两个线程new Thread1().start();new Thread2().start();}
}

在这个示例中,我们定义了两个资源resource1和resource2,以及两个线程Thread1和Thread2。线程1首先获取resource1的锁,然后尝试获取resource2的锁。与此同时,线程2首先获取resource2的锁,然后尝试获取resource1的锁。

由于线程1已经持有了resource1的锁,而线程2持有了resource2的锁,当线程1尝试获取resource2的锁时,它会被阻塞,因为线程2已经持有了这个锁。同样地,当线程2尝试获取resource1的锁时,它也会被阻塞,因为线程1已经持有了这个锁。这就导致了两个线程互相等待对方释放资源,从而发生了死锁。


http://www.ppmy.cn/ops/48054.html

相关文章

The Israeli-Palestinian conflict

目录 历史背景现代冲突的起源关键战争和事件巴勒斯坦内战和平进程和持续的冲突近年的局势 历史背景 古代历史:以色列和巴勒斯坦地区的历史可以追溯到几千年前。古代以色列王国和犹太人以及其他民族都在这片土地上生活过。 奥斯曼帝国:从16世纪到20世纪初…

51 单片机[6]:矩阵键盘及密码锁

一、认识矩阵键盘 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式 采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态 扫描的概念 数码管扫描(输出扫描) 原理:显示第1位→显…

ON DUPLICATE KEY UPDATE 子句

ON DUPLICATE KEY UPDATE 是 MySQL 中的一个 SQL 语句中的子句,主要用于在执行 INSERT 操作时处理可能出现的重复键值冲突。当尝试插入的记录导致唯一索引或主键约束冲突时(即试图插入的记录的键值已经存在于表中),此子句会触发一…

QuanTA: 一种新的高秩高效微调范式

QuanTA方法的核心是利用张量操作来模拟量子电路中的门操作。这些张量被设计为仅在特定的轴上应用,类似于量子电路中的单量子比特或双量子比特门。通过这种方式,QuanTA能够以高秩参数化来适应LLMs的权重矩阵。 网址:QuanTA: 一种新的高秩高效微…

系统架构设计师【论文-2016年 试题4】: 论微服务架构及其应用(包括写作要点和经典范文)

论微服务架构及其应用(2016年 试题4) 近年来,随着互联网行业的迅猛发展,公司或组织业务的不断扩张,需求的快速变化以及用户量的不断增加,传统的单块(Monolithic)软件架构面临着越来越多的挑战,…

Jetpack Compose Navigation 遇上类型安全

Jetpack Compose Navigation 遇上类型安全 引言 随着 Navigation 2.8.0-alpha08 版本的发布,Navigation 组件引入了基于 Kotlin Serialization 的完整类型安全系统,用于在使用 Kotlin DSL 时定义导航图。这一新特性旨在与 Navigation Compose 等集成最…

问题 B: 2.左右(lr.cpp/pas)

目录 题目描述 输入 输出 样例输入 复制 样例输出 复制 提示 题目描述 小明近来开发了一个数字游戏。它随机写了一组数字a1、a2……ai,然后将一个数字m交给一位同学,让他们将数字m插入到a1、a2……ai之间(不能在a1前或在an之后)。…

操作系统复习-Linux的文件系统

文件系统概述 FAT FAT(File Allocation Table)FAT16、FAT32等,微软Dos/Windows使用的文件系统使用一张表保存盘块的信息 NTFS NTFS (New Technology File System)WindowsNT环境的文件系统NTFS对FAT进行了改进,取代了日的文件系统 EXT EXT(Extended…