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;
}
}