线程死锁 Java第十八天(四)

本文通过一个具体的Java代码示例,详细解析了线程死锁的现象及发生原因。展示了如何通过两个线程分别获取不同的锁,进而导致彼此无法继续执行而陷入死锁的状态。

Java第十八天(四)

线程

 线程死锁

 线程同步锁类 

public class Lock {
//	创建线程同步锁1
	static Object lock1 = new Object();
//	创建线程同步锁2
	static Object lock2 = new Object();
}

 线程类 

public class ThreadDieLock implements Runnable{
//	定义一个flag成员变量用来控制下面的代码
	private boolean flag;
	
//	将flag的构造器显示地定义出来
	public ThreadDieLock(boolean flag) {
		super();
		this.flag = flag;
	}

	@Override
	public void run() {
		if(flag) {
			synchronized (Lock.lock1) {
				System.out.println("线程一使用了线程同步锁1!");
				synchronized (Lock.lock2) {
					System.out.println("线程一使用了线程同步锁2!");
				}
			}
		}else {
			synchronized (Lock.lock2) {
				System.out.println("线程二使用了线程同步锁2!");
				synchronized (Lock.lock1) {
					System.out.println("线程二使用了线程同步锁1!");
				}
			}
		}
	}
}

 测试类 

public class ThreadDieLockTest {
	public static void main(String[] args) {
//		这里的参数列表的值决定if语句的结果
		
//		先执行if语句块内的语句
		ThreadDieLock th = new ThreadDieLock(true);
//		再执行else语句块内的语句
		ThreadDieLock th2 = new ThreadDieLock(false);
		
		Thread t = new Thread(th);
		Thread t2 = new Thread(th2);
		
		t.start();
		t2.start();
	}
}

输出结果:
线程一使用了线程同步锁1!
线程二使用了线程同步锁2

  上述代码就是一个明显的线程死锁的例子,并且执行完后JVM还处于运行状态。
执行逻辑:
 ①在if语句块内让线程一去获得线程同步锁1,然后在线程同步锁1的代码块中再让线程一获得线程同步锁2;
 ②在else语句块内让线程二获得线程同步锁2,然后在线程同步锁2的代码块中再让线程二获得线程同步锁2;

 在测试类代码中,我们的理想结果是先让线程一获得到线程同步锁1,然后线程二获得线程同步锁2,再然后让线程一获得到线程同步锁2,最后让线程二获得到线程同步锁2。

但实际是由于一开始线程一获得到了线程同步锁1,线程二获得到线程同步锁2,并且在两个线程都没有释放线程同步锁的前提下去获取互相的同步锁,于是就造成了线程死锁的情况,在做线程开发时,要避免线程死锁的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值