java再复习——线程的死锁问题

本文通过一个具体的多线程示例介绍了死锁的概念及发生原因。当两个线程分别持有不同的锁并尝试获取对方持有的锁时,就会发生死锁现象,导致程序无法继续执行。

使用多线程的时候,除了因为操作共享数据带来的安全问题,还有一个就是因为,为了避免安全问题去使用同步,但是因为同步使用不当而产生的死锁问题。

例子:

public class DeadLockDemo {

	public static void main(String[] args) {
		Data data = new Data();
		new Thread(new RunnableA(data)).start();
		new Thread(new RunnableB(data)).start();
	}
	
}

class RunnableA implements Runnable{
	
	Data data;
	
	public RunnableA(Data data){
		this.data = data;
	}

	public void run() {
		synchronized(this){
			System.out.println(data.i--);
			synchronized(data){
				System.out.println(data.i--);
			}
		}
	}
	
}

class RunnableB implements Runnable{
	
	Data data;
	
	public RunnableB(Data data){
		this.data = data;
	}

	public void run() {
		synchronized(this){
			System.out.println(data.i--);
			synchronized(data){
				System.out.println(data.i--);
			}
		}
	}
	
}

class Data {
	public int i = 100;
}


发生死锁的原因:

同步代码块的嵌套。同步代码块互相嵌套会发生互相所要锁的问题,如果一个线程拿到了A锁等B锁,另一个线程拿到了B锁等A锁,那么程序就会堵死,执行不下去,这就是死锁。

上面的例子举的不是很好。因为死锁这问题,在编写多线程的时候规范,一般不会出现的。就算出现了,知道原因,根据原因去查哪里写的不规范就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值