Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 理解临界区域_Java_Deadlock_Mutual Exclusion - Fatal编程技术网

Java 理解临界区域

Java 理解临界区域,java,deadlock,mutual-exclusion,Java,Deadlock,Mutual Exclusion,我在网上读了一些关于关键区域、进入协议和退出协议的例子,很难弄清楚。 这个例子的进入协议、退出协议和关键区域是什么? 至于关键区域,是相互排斥、饥饿还是会导致僵局?假设我是出纳员1。您是出纳员0 lock[tellerID]=true 我为自己抓了一把锁 turn=1-出纳员ID 我说“现在轮到你了。”轮到被设置为另一个出纳员的ID(现在) while锁定[1-tellerID] 我在你有锁时循环 whileturn==(1-tellerID) 轮到你时,我也循环 想象我们都一个接一个地到达w

我在网上读了一些关于关键区域、进入协议和退出协议的例子,很难弄清楚。

这个例子的进入协议、退出协议和关键区域是什么?
至于关键区域,是相互排斥、饥饿还是会导致僵局?

假设我是出纳员1。您是出纳员0

lock[tellerID]=true

我为自己抓了一把锁

turn=1-出纳员ID

我说“现在轮到你了。”轮到被设置为另一个出纳员的ID(现在)

while
锁定[1-tellerID]

在你有锁时循环

while
turn==(1-tellerID)

轮到你时,我也循环

想象我们都一个接一个地到达while循环。我有我的锁,你有你的锁。我们都在等待对方释放锁,或者轮到我们。轮到你或我了,所以我们中只有一个人通过了这个循环。这显然是相互排斥。当你再次存款时,你会通知我轮到我了


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

我在想输入协议是否为lock[tellerID]=true;退出协议为lock[tellerID]=false;关键区域while(lock[1-tellerID]&&turn==(1-tellerID));?首先,您提供的链接已经为您提供了答案,其次,如果您不能理解为什么您展示的示例会导致死锁,我建议您至少阅读一下并发性。第三,你复制了一个错误的例子
private boolean lock={true,true}
应该是
private boolean lock[]={true,true}
为什么不用你所问的所有术语的定义来改进你的问题,你对这些定义如何应用于问题的解释,你认为答案是什么,也许是一个实际的问题,比如“我不明白这部分的意思,我在谷歌上找不到答案。”当你说
时,我很难弄明白。。我的眼睛有点呆滞。你连续两天都在干什么?或者是两个小时?顺便说一下,这里只有两个出纳员ID,所以我能想到的可能出现的情况只有四种。如果你真的把它们写在纸上,你会非常清楚地看到这个问题。我会给你一个提示-入口协议并不都在一行上。循环中的条件是&&条件,这意味着它们必须都是真的。轮到我了,或者你一打开锁,我就要走了。所以,如果你先去,我会等到你打开锁。如果我先去,你就等我把锁打开。轮到我或你,所以我们避免“卡住”。这是互斥而不是死锁,因为我读到线程0必须等待线程1才能继续。所以我可以说关键区域是balance+=amount@i-link关键区域是入口和出口协议之间的所有内容。不要试图自行确定临界区域。。。这只会让你在课堂上考试不及格。我可以说,
I LOVE PRETTY FLOWERS
是关键区域,只要它位于进入和退出协议之间。我能说while(lock[1-tellerID])总是正确的吗?原因在编码的第一部分,两个锁都设置为真?无论是线程1还是线程0。lock[1-0]和lock[1-1]都是真的吗?
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;
    }
}