是否有可能陷入僵局?

时间:2013-12-11 04:11:15

标签: java concurrency deadlock

我正在努力弄清楚死锁是如何起作用的......

public void withdraw(double amount) {
  balanceChangeLock.lock();
  try {
      while (balance < amount) {} // wait balance to grow ...
      double nb = balance - amount;
      balance = nb; 
  } finally {
      balanceChangeLock.unlock();
 }
}

编辑:我遗漏了更多代码

public void deposit(double amount){
  balanceChangeLock.lock();
  try{
    balance = balance + amount;
  } finally {
    balanceChangeLock.unlock();
 }
}

是否可以使用此代码达到死锁?

这不是作业,我有一个决赛,这是我老师的笔记我正在复习,我不太明白

2 个答案:

答案 0 :(得分:1)

让我通过一个简单的例子帮助您了解死锁是什么:

我们有两个帖子(T1, T2) 我们有两个锁(L1, L2) 我们有两个关键的关键操作(OP1 and OP2)需要获取L1L2才能执行

发生以下执行顺序:

T1 begins executing OP1
T2 begins executing OP2
T1 acquires L1 as part of OP1
T2 acquires L2 as part of OP2
T1 attempts to acquire L2 and is blocked because L2 is currently held by T1
T2 attempts to acquire L1 and is blocked because L1 is currently held by T1
因此,我们处于致命的拥抱之中。这只是一个简单的例子。如果你使用上面的场景创建一个图表来看它会发挥作用将会有所帮助。请注意,获取锁的顺序对于使死锁显示至关重要。这是为什么这些问题是间歇性的并且众所周知难以调试的部分原因。

答案 1 :(得分:0)

是的,这里可能发生死锁。

以下是可能导致死锁的执行流程

    调用
  1. withdraw并且余额不足以绘制金额。因此,代码保持在while循环中并保持锁定。
  2. deposit被调用并尝试锁定balanceChangeLock,但它不能,因为withdraw具有锁定。等等。
  3. 现在withdraw正在等待存款,而deposit正在等待锁定被释放。代码不会在任何一个线程中继续,并且您有死锁。