Java产生死锁的一个简单例子-追风

博客介绍了Java中线程同步导致死锁的情况。通过创建两个字符串和两个线程,让线程按不同顺序锁定字符串,当出现相互等待对方释放锁时就会陷入死锁。还展示了只运行一个线程时不会出现死锁的情况。

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

思路是创建两个字符串a和b,再创建两个线程A和B,让每个线程都用synchronized锁住字符串(A先锁a,再去锁b;B先锁b,再锁a),如果A锁住a,B锁住b,A就没办法锁住b,B也没办法锁住a,这时就陷入了死锁。直接贴代码:

	public class DeadLock {
		public static String obj1 = "obj1";
		public static String obj2 = "obj2";

		public static void main(String[] args) {
			Thread a = new Thread(new Lock1());
			Thread b = new Thread(new Lock2());
			a.start();
			b.start();
		}
	}

	class Lock1 implements Runnable {
		@Override
		public void run() {
			try {
				System.out.println("Lock1 running");
				while (true) {
					synchronized (DeadLock.obj1) {
						System.out.println("Lock1 lock obj1");
						Thread.sleep(3000);// 获取obj1后先等一会儿,让Lock2有足够的时间锁住obj2
						synchronized (DeadLock.obj2) {
							System.out.println("Lock1 lock obj2");
						}
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	class Lock2 implements Runnable {
		@Override
		public void run() {
			try {
				System.out.println("Lock2 running");
				while (true) {
					synchronized (DeadLock.obj2) {
						System.out.println("Lock2 lock obj2");
						Thread.sleep(3000);
						synchronized (DeadLock.obj1) {
							System.out.println("Lock2 lock obj1");
						}
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

运行的结果如图所示:
在这里插入图片描述
可以看到,Lock1获取obj1,Lock2获取obj2,但是它们都没有办法再获取另外一个obj,因为它们都在等待对方先释放锁,这时就是死锁。

如果我们只运行Lock1呢?修改一下main函数,把线程b注释掉。

	public class DeadLock {
		public static String obj1 = "obj1";
		public static String obj2 = "obj2";

		public static void main(String[] args) {
			Thread a = new Thread(new Lock1());
			// Thread b = new Thread(new Lock2());
			a.start();
			// b.start();
		}
	}

	class Lock1 implements Runnable {
		@Override
		public void run() {
			try {
				System.out.println("Lock1 running");
				while (true) {
					synchronized (DeadLock.obj1) {
						System.out.println("Lock1 lock obj1");
						Thread.sleep(3000);
						synchronized (DeadLock.obj2) {
							System.out.println("Lock1 lock obj2");
						}
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	class Lock2 implements Runnable {
		@Override
		public void run() {
			try {
				System.out.println("Lock2 running");
				while (true) {
					synchronized (DeadLock.obj2) {
						System.out.println("Lock2 lock obj2");
						Thread.sleep(3000);
						synchronized (DeadLock.obj1) {
							System.out.println("Lock2 lock obj1");
						}
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

运行结果为:
在这里插入图片描述

由于没有其它线程和Lock1争夺obj1和obj2,Lock1可以不断地循环获取并释放它们,这时没有死锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值