Java 多线程例子7 线程安全 死锁

本文探讨了Java中死锁的概念及其形成的简单例子。通过分析代码,揭示了死锁发生的条件,并解释了使用字符串常量时的特殊行为。实验展示了在不同情况下死锁现象的表现。

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

死锁:在多个线程里对多个同步对象具有循环依赖时常会出现死锁。最简单的死锁例子就是线程一得到了A对象的锁旗标想得到B对象的锁旗标,线程二得到了B对象的锁旗标想得到A对象的锁旗标,这样线程一和线程二就形成了死锁。

例子:

 

class ThreadDemo {
	public static void main(String[] args) {
		TestThread t = new TestThread();
		new Thread(t).start();
		try{Thread.sleep(10);}catch(Exception e) {}
		t.flag = true;
		new Thread(t).start();
	}
}

class TestThread implements Runnable {
	boolean flag = false;
	String A=new String("");
	String B=new String("");
//	String A="";
//	String B="";
	
	public void run() {
		System.out.println(A==B);
		if(flag) {
			while(true) {
				synchronized(A) {
					try{Thread.sleep(100);}catch(Exception e) {}
					synchronized(B) {}
				}
				System.out.println("AA...running...");
			}
		} else  {
			while(true) {
				synchronized(B) {
					try{Thread.sleep(100);}catch(Exception e) {}
					synchronized(A) {}
				}
				System.out.println("BB...running...");
				}
		}
	}
}

 

这里启动了两个线程,两个线程都循环想要得到A对象和B对象的锁旗标。

在试验这个例子的时候,还遇到了一个有意思的问题:刚开始我用的A和B对象是这么写的A="";B="";结果死活实验不出来死锁问题,这倒是挺奇怪的。结果最后发现原来这时候A和B引用了同一个对象,这是更java中对字符串常量的处理有关系,A="";时,java会在堆中建立一个字符串常量,这个字符串常量为空,由A引用,在B="",java发现字符串常量中有这么一个空字符串常量就不会新建了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值