线程死锁

线程死锁


一、产生死锁的原因

要知道为什么会产生死锁,首先我们需要知道,线程同步
当两个或两个以上的线程需要共享资源时,它们需要某种方法来确定 资源在某一刻仅被一个线程占用 。达到此目的 的过程叫做同步(synchroniztion)

同步的关键是 管程 (也叫信号量semaphore)的概念。管程是一个互斥独占锁定的对象 ,或称 互斥体(mutex)

在给定的时间,仅有一个线程可以获得管程。

当一个线程需要锁定,他必须进入管程。所有其他试图进入已近锁定的管程 的线程必须挂起直到第一个线程退出管程。这些其他的线程被称为 等待管程。一个拥有管程的线程如果愿意的话可以再次进入相同的管程

二、线程死锁

上面介绍了管程再来看这里就会很容易理解死锁了
所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。

因此我们举个例子来描述,如果此时有一个线程A按照先锁key1再获得锁key2的的顺序获得锁而在此同时又有另外一个线程B,按照先锁key2再锁key1的顺序获得锁。就会产生死锁

例如下面这段代码所示:
线程张三和李四,分别代表上面的线程A和B

public class DeadLlock {
	//死锁例子
	//成员内部类
	public class Lock implements Runnable{
		//这是两把锁对象 key1和key2
		private Object key1=new Object();
		private Object key2=new Object();
		
		//用于控制线程拿钥匙顺序
		private boolean flag=true;
		@Override
		public void run() {
			if(flag) {
				flag=false;
				
				synchronized(key1) {
					System.out.println(Thread.currentThread().getName()+"  key1");
					
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					
					synchronized(key2) {
						System.out.println(Thread.currentThread().getName()+"  key2");
					}
				}
				
			}else {
				flag=true;
				synchronized(key2) {
					System.out.println(Thread.currentThread().getName()+" key2");
					
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					
					synchronized(key1) {
						System.out.println(Thread.currentThread().getName()+" key1");
					}
				}
				
			}
			
		}
	} 
	
	public void myrun() {
		Lock l=new Lock();
		Thread t1=new Thread(l,"张三");
		Thread t2=new Thread(l,"李四");
		
		t1.start();
		t2.start();
	}
	
	public static void main(String[] args) {
		DeadLlock dl=new DeadLlock();
		dl.myrun();
	}

	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值