Java 中存在一种快速失败的同步方式,即 tryLock
。tryLock
是一种非阻塞的锁,如果锁可用,则获取它并立即返回 true
;如果锁不可用,不会造成当前线程阻塞,而是返回 false
。如果希望获取锁,可以立即在 tryLock
的 catch
块中再次尝试获取锁,这样可以在发生异常时快速失败,提高并发效率。
public void transfer(Account fromAccount, Account toAccount, double amount) {
boolean hasLocks = false;
while (!hasLocks) {
if (fromAccount.getLock().tryLock()) {
try {
if (toAccount.getLock().tryLock()) {
try {
fromAccount.withdraw(amount);
toAccount.deposit(amount);
hasLocks = true;
} finally {
toAccount.getLock().unlock();
}
}
} finally {
fromAccount.getLock().unlock();
}
}
// 等待一段时间然后重试
if (!hasLocks) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
需要注意的是,tryLock
方法在处理一些异常情况(如:锁被其他线程持有)时仍然有局限性。更强大的同步工具可以考虑使用 ReentrantLock
或 Semaphore
,它们提供了更丰富的功能,如超时、支持 fair/unfair 锁等。
领取专属 10元无门槛券
手把手带您无忧上云