了解关键区域

时间:2014-02-27 15:15:17

标签: java deadlock mutual-exclusion

我正在网上阅读关于关键区域,入口协议和退出协议的一些例子,并且很难搞清楚。 http://pages.cs.wisc.edu/~dusseau/Classes/CS537-S01/SampleQuizzes/sol2.html

class BankAccount {

    private int turn = 0;
    private boolean lock = {true, true};
    private int balance;
    private int accountNumber;

    BankAccount(int acct) {
        accountNumber = acct;
        balance = 0;
    }

   // tellerID is either 0 or 1
   public void deposit(int amount, int tellerID) {
        lock[tellerID] = true;
        turn = 1 - tellerID;
        while (lock[1-tellerID] && turn == (1 - tellerID));
        balance += amount;
        lock[tellerID] = false;
    }
}

此示例的入口协议,退出协议和关键区域是什么? 至于关键区域,它是相互排斥,饥饿还是会导致僵局?

1 个答案:

答案 0 :(得分:1)

假设我是出纳员1.你是出纳员。

lock[tellerID] = true;

我为自己抓住了锁。

turn = 1 - tellerID;

我说“现在轮到你了。”将转弯设置为其他出纳员的ID(暂时)。

while lock[1-tellerID]

我锁定时循环

while turn == (1 - tellerID)

轮到你时循环

想象一下,我们一个接一个地到达了while循环。我有锁,你有锁。我们都在等待对方释放锁定,或者轮到我们。它必须轮到您轮到我,所以我们中只有一个人会经历这个循环。这显然是互斥。当你再去存款时,你会通知我轮到我了。

等待,抓住锁定和轮流都是条目协议的一部分。释放锁是退出协议的一部分。默认情况下,介于两者之间的所有内容都是关键部分。默认情况下,外面的所有内容都是非关键部分