点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!
这种情况经常发生在多线程环境下,当多一个线程尝试同时获取多个资源的锁时,可能会发生死锁。
2.2 死锁的检测方法
避免循环等待 确保线程获取资源的顺序是一致的,形成避免循环等待链。 按顺序获取锁 尽量避免同时获取多个资源的锁,而是按照固定的顺序获取锁,降低发生死锁的概率。
相比于synchronized关键字,Lock对象提供了更灵活的锁定机制,包括可中断的锁、可超时的锁等,可以更好地避免死锁的发生。
public class Example {
private static final Object lock1 = new Object();
private static final Object lock2 = new Object();
public static void main(String[] args) {
Thread thread1 = new Thread(() -> {
synchronized (lock1) {
System.out.println("Thread 1: Holding lock 1...");
try {
Thread.sleep(1000); //模拟一些处理时间
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock2) {
System.out.println("Thread 1: Holding lock 1 and lock 2...");
}
}
});
Thread thread2 = new Thread(() -> {
synchronized (lock2) {
System.out.println("Thread 2: Holding lock 2...");
try {
Thread.sleep(1000); //模拟一些处理时间
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock1) {
System.out.println("Thread 2: Holding lock 2 and lock 1...");
}
}
});
thread1.start();
thread2.start();
}
}
//线程1synchronized (lock1) {
System.out.println("Thread 1: Holding lock 1...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock2) {
System.out.println("Thread 1: Holding lock 1 and lock 2...");
}
}//线程2synchronized (lock1) { //保持相同的加锁顺序
System.out.println("Thread 2: Holding lock 1...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock2) {
System.out.println("Thread 2: Holding lock 1 and lock 2...");
}
}

本文作者:李伟康(上海新炬中北团队)
本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




