一、怎么防止死锁发生
死锁是指两个或多个进程持有资源,但是它们都在等待其他进程释放它们所需要的资源,从而导致所有的进程都无法向前执行的情况。防止死锁的发生需要从代码编写、资源获取等多个方面入手,下面分别介绍。
二、列举死锁的各种防止策略
1、避免使用多个锁或资源的情况,如果需要使用,可以按照统一的顺序获取它们,避免持有不同的资源。
class BankAccount { private Double balance; private Lock lock1 = new ReentrantLock(); private Lock lock2 = new ReentrantLock(); public void transfer(BankAccount to, Double amount){ lock1.lock(); to.lock2.lock(); try{ ... } finally { to.lock2.unlock(); lock1.unlock(); } } }
2、利用超时机制,当线程尝试获取锁一定时间后仍然无法成功,就会释放所有的锁。
class BankAccount { private Double balance; private Lock lock1 = new ReentrantLock(); private Lock lock2 = new ReentrantLock(); public void transfer(BankAccount to, Double amount){ boolean success = false; while(!success){ if(lock1.tryLock()){ if(to.lock2.tryLock()){ success = true; } else { lock1.unlock(); } } ... } } }
3、使用死锁检测器检测潜在死锁,并进行解决。
public class DeadlockDetector { private ThreadMXBean bean = ManagementFactory.getThreadMXBean(); public void detectDeadlock(){ long[] threadIds = bean.findDeadlockedThreads(); if(threadIds != null){ ThreadInfo[] infos = bean.getThreadInfo(threadIds); for(ThreadInfo info : infos){ System.out.println("发现死锁:" + info.getThreadName()); ... } } } }
三、什么是死锁怎么防止死锁
死锁是指两个或多个进程持有资源,但是它们都在等待其他进程释放它们所需要的资源,从而导致所有的进程都无法向前执行的情况。防止死锁需要从资源的使用、获取等多个方面避免。
四、下列关于死锁的防止叙述正确的是
1、可以使用超时机制来避免死锁的发生,当线程尝试获取锁一定时间后仍然无法成功,就会释放所有的锁。
2、只需要按照统一的顺序获取锁,就可以避免死锁的情况。
3、使用死锁检测器可以检测潜在死锁,并进行解决。
上述均为正确的叙述,但是防止死锁还需要从多个方面考虑,比如资源的分配、释放等。