在我目前的任务中,我们将使用信号量来同步对关键部分的访问。但是,提供的实现让我质疑它是否正确实施。我希望有人确认我的担忧。
var result = (from es in EmployeeSkills
select new
{
YearsOfExperience = es.YearsOfExperience,
Name = Employees
.Where(emp => emp.EmployeeID == es.SkillID)
.Select(emp => new
{
Name = emp.FirstName + " " + emp.LastName
})
}).ToList().OrderByDesc(es => es.YearsOfExperience).FirstOrDefault();
我相信此代码中存在死锁的可能性:
public class Semaphore {
private int iValue;
public Semaphore(int piValue) {
this.iValue = piValue;
}
public Semaphore() {
this(0);
}
public synchronized boolean isLocked() {
return (this.iValue <= 0);
}
public synchronized void P() {
try {
while(this.iValue <= 0) {
wait();
}
this.iValue--;
} catch(InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void V() {
++this.iValue;
notifyAll();
}
}
和P()
递减为0. iValue
之前调用P()
。 V()
的值为0,因此它进入while循环。iValue
,但不能,因为线程B持有锁。因此,存在僵局。我的结论是否正确?
答案 0 :(得分:3)
没有
当你wait
锁定被释放时(等待结束后你会恢复锁定)。
当前线程必须拥有此对象的监视器。该线程释放该监视器的所有权并等待,直到另一个线程通过调用notify方法或notifyAll方法通知等待该对象监视器的线程唤醒。然后线程等待,直到它可以重新获得监视器的所有权并继续执行。