答案:破坏死锁的循环等待和持有并等待条件可有效防止死锁。1. 按序获取锁避免循环等待;2. 使用tryLock破坏持有并等待;3. 减少锁嵌套;4. 使用定时锁超时机制,提升并发安全性。

在 Java 中防止死锁,关键在于破坏死锁产生的四个必要条件之一:互斥、持有并等待、不可抢占、循环等待。我们通常通过设计策略来避免“循环等待”和“持有并等待”,这是最有效的手段。
如果所有线程以相同的顺序获取多个锁,就不会出现循环等待的情况。
示例:
public class SafeLock {
private static final Object lock1 = new Object();
private static final Object lock2 = new Object();
public void methodA() {
synchronized (lock1) {
synchronized (lock2) {
// 执行操作
}
}
}
public void methodB() {
synchronized (lock1) { // 注意:也先获取 lock1
synchronized (lock2) {
// 执行操作
}
}
}
}
使用 ReentrantLock.tryLock() 可以尝试获取锁,失败时释放已持有的资源,避免长时间占用。
立即学习“Java免费学习笔记(深入)”;
示例:
private final ReentrantLock lock1 = new ReentrantLock();
private final ReentrantLock lock2 = new ReentrantLock();
public boolean transferMoney(Account from, Account to, int amount) {
while (true) {
if (lock1.tryLock()) {
try {
if (lock2.tryLock()) {
try {
// 执行转账逻辑
return true;
} finally {
lock2.unlock();
}
}
} finally {
lock1.unlock();
}
}
// 可加短暂休眠避免忙等
Thread.yield();
}
}
锁嵌套越多,越容易出问题。可以通过以下方式优化:
使用 tryLock(long timeout, TimeUnit unit) 设置获取锁的最长等待时间。
if (lock1.tryLock(1, TimeUnit.SECONDS)) {
try {
if (lock2.tryLock(1, TimeUnit.SECONDS)) {
try {
// 正常操作
} finally {
lock2.unlock();
}
}
} finally {
lock1.unlock();
}
}
这种方式能在无法获取锁时主动退出,防止永久阻塞。
基本上就这些。只要注意锁的获取顺序、避免嵌套、合理使用 tryLock,就能在大多数场景下有效防止死锁。以上就是java 中怎么防止死锁?的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号