死锁相关细节

什么是死锁?

假如在程序运行中,线程a获得了对象锁,并在执行程序时,线程a需要再取得另外一个对象锁才能继续进行程序的执行,但此时对象a的所需的对象锁被另一个线程(b)获得,而b线程需要a线程手中的对象锁,那么此时二者就形成了 死锁 ,两个线程都会同时处于饥饿状态,等待对面释放出对象锁,导致线程无法进行执行

简易死锁代码:

package deadlock;

public class DealLock {

	public static void main(String[] args) {
		DealLock dealLock = new DealLock();
		dealLock.DoIt();
	}

	public void DoIt() {
		Dl l = new Dl();
		//新建两个线程,分别为线程1线程2
		Thread t1 = new Thread(l, "线程1");
		Thread t2 = new Thread(l, "线程2");

		t1.start();
		t2.start();

	}
    
	//实现线程接口:
	public class Dl implements Runnable {
		boolean flag = true;//用于判断线程状态
		private Object a = new Object();
		private Object b = new Object();

		@Override
		public void run() {
			if (flag) {
				flag = false;
				synchronized (a) {
					System.out.println(Thread.currentThread().getName() + "正在运行");
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					synchronized (b) {
						System.out.println(Thread.currentThread().getName() + "正在运行");
					}
				}
			} else {
				flag = true;
				synchronized (b) {
					System.out.println(Thread.currentThread().getName() + "正在运行");
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					synchronized (a) {
						System.out.println(Thread.currentThread().getName() + "正在运行");
					}
				}
			}

		}

	}

}

死锁如何进行避免?

死锁的产生大多是由于程序的设计层级考虑不完善导致的,产生的原因来自于当前线程对于对象锁无法进行获取。因此需要考虑清除每个对象锁的优先级顺序,在释放时,必须优先考虑较高优先级的对象锁。

当前线程优先级较高
先释放已经拥有的对象锁
再重新获取所需要的对象锁
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值