什么是死锁
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞现象,简单举个例子:
现有两个线程:线程A,线程B
两个
Lock
:Lock1
,Lock2
,分别作为同步代码块的锁①线程A的同步代码块中优获取
Lock1
的对象锁,在睡眠一小段时间过后,获取Lock2
对象锁②线程B的同步代码块中优获取
Lock2
的对象锁,在睡眠一小段时间过后,获取Lock1
对象锁假设线程A获取到了
Lock1
对象锁,在经过短时间睡眠后(睡眠过程中线程B获取到了Lock2
对象锁),线程A尝试获取Lock2
对象锁时被阻塞了,这就形成了一个死锁
public class Test { public static void main(String[] args) throws InterruptedException { Object lock1 = new Object(); Object lock2 = new Object(); /** * 创建第一个线程 */ Thread t1 = new Thread(new Runnable() { @Override public void run() { synchronized (lock1){ System.out.println("线程1拿到了锁"); try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock2){ System.out.println("线程1的锁2"); } } } }); t1.start(); //t1.join();②设置锁的持有时间 /** * 创建第二个线程 */ Thread t2 = new Thread(new Runnable() { @Override public void run() { synchronized (lock2){//synchronized (lock1){线程获取锁的顺序一致 System.out.println("线程2拿到了锁"); synchronized (lock1){//synchronized (lock2){线程获取锁的顺序一致 System.out.println("线程2的锁1"); } } } }); t2.start(); //t2.join(1000);②种方式:设置锁的持有时间 } }
死锁产生的原因
互斥条件: 进程所访问到的资源不允许其他进程进行访问,若其他进程想要访问该资源,只能等到占用该资源 的进程使用完成后释放该资源才能访问
请求和保持条件:进程获得一定的资源之后,又对其他资源发出请求,但是该资源可能被其他进程占有,此 事请求阻塞,但又对自己获得的资源保持不放
不可剥夺条件:是指进程已获得的资源,在未完成使用之前,不可被剥夺,只能在使用完后自己释放
循环等待条件:是指进程发生死锁后,必然存在一个进程–资源之间的环形链请求和保持条件:进程获得一定 的资源之后,又对其他资源发出请求,但是该资源可能被其他进程占有,此事请求阻塞,但 又对自己获得的资源保持不放
处理死锁的方法
预防死锁:通过设置一些限制条件,去破坏产生死锁必要条件的一个或多个来预防死锁
避免死锁:在资源分配过程中,使用某种方法避免系统进入不安全的状态,从而避免发生死锁
检测死锁:允许死锁的发生,但是通过系统的检测之后,采取一些措施,将死锁清除掉
解除死锁:当检测出死锁后,便采取适当措施将进程从死锁状态中解脱出来处理死锁的基本方法
本文含有隐藏内容,请 开通VIP 后查看