
当线程1持有锁A并申请锁B时java多线程避免死锁,此时线程2持有锁B并申请锁A,将导致进程死锁. 在这种情况下,除非手动终止Java进程,否则这两个线程将无法打破死锁.


image.png
当多个线程需要申请多个资源时java多线程避免死锁,如果应用资源的顺序相同,则可以保证只有一个线程可以随时获取所有资源,而其他线程必须等待当前线程释放所有资源. 重新获取锁.


image.png

尽管多线程可以通过按固定顺序请求资源来避免死锁,但实际的业务场景正在不断变化,并且难以保证它们始终处于理想状态.
仅当检测到死锁状态时,才能执行目标业务处理.

ThreadMXBean是java.lang.management包提供的工具类,可以通过ThreadMXBean类的findDeadlockedThreads()方法获取死锁线程号.
public class DeadLockDemo {
private Object lock1 = new Object();
private Object lock2 = new Object();
public void doActionA() {
synchronized (lock1) {
System.out.println(Thread.currentThread() + ": acquire lock1");
try {
// 线程阻塞,让其他线程拿到lock2
Thread.sleep(10);
} catch (Exception e) {
}
synchronized (lock2) {
System.out.println(Thread.currentThread() + ": acquire lock2");
}
}
}
public void doActionB() {
synchronized (lock2) {
System.out.println(Thread.currentThread() + ": acquire lock2");
synchronized (lock1) {
System.out.println(Thread.currentThread() + ": acquire lock1");
}
}
}
public static void main(String[] args) {
Thread monitorThread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
ThreadMXBean tmx = ManagementFactory.getThreadMXBean();
long[] ids = tmx.findDeadlockedThreads();
if (ids != null) {
ThreadInfo[] tmxThreadInfo = tmx.getThreadInfo(ids, true, true);
System.out.println("The following threads are deadlocked:");
for (ThreadInfo ti : tmxThreadInfo) {
System.out.println(ti);
}
break;
}
}
}
});
monitorThread.start();
DeadLockDemo demo = new DeadLockDemo();
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
demo.doActionA();
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
demo.doActionB();
}
});
thread1.start();
thread2.start();
}
}
总是很难避免死锁的发生,并且只有在设计多个线程时才能充分考虑死锁的风险. 对于业务要求严格的场景,可以采用必要的死锁检测机制,以确保系统的健壮性.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-227886-1.html
自己没理由把伊拉克打碎了还在干协别人站队