java写一个简单的死锁程序

本文通过一个简单的Java程序展示了死锁的概念。程序创建两个线程,各自执行不同的synchronized方法块,并在特定点暂停。线程1等待线程2释放Main.class锁,而线程2等待线程1释放String.class锁,导致双方相互等待,形成死锁状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java写一个简单的死锁程序

package com.hzl.java.Thread;

public class DeanLock {
	public static void main(String[] args) {
		new Thread(() -> {
			try {
				System.out.println("thread1 is running");
				synchronized (DeanLock.class) {
					System.out.println("thread is block obj1");

					Thread.sleep(1000);
					synchronized (Object.class) {
						System.out.println("thread is block ojb2");
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}).start();
		new Thread(() -> {
			try {
				System.out.println("thread1 is running");
				synchronized (Object.class) {
					System.out.println("thread is block obj1");

					Thread.sleep(1000);
					synchronized (DeanLock.class) {
						System.out.println("thread is block ojb2");
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}).start();
	}
}

结果分析:当程序开始执行时,创建两个线程,分别执行不同的synchronized 方法块;并且都在Thread.sleep(1000);处停下来,此时当线程1先sleep结束后;准备用Main.class开 synchronized 这把锁进入 synchronized (Main.class) 方法块,但是发现线程2还没有苏醒,所以 线程1就等着线程2执行完毕,释放出 Main.class 钥匙,这时候 线程2苏醒了,准备拿String.class 这把钥匙,去开synchronized 这把锁,进入synchronized (String.class) 方法块;但是发现线程1 也在等着 线程2释放 Main.class钥匙,所以就导致
线程1等着线程2 释放 Main.class钥匙, 线程2等着线程1 释放 String.class 这把钥匙,所以这个程序就僵持住了,成了一个死锁的程序;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值