这种信号量实现是否有问题?

时间:2015-10-28 04:15:52

标签: java multithreading semaphore

在我目前的任务中,我们将使用信号量来同步对关键部分的访问。但是,提供的实现让我质疑它是否正确实施。我希望有人确认我的担忧。

  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();

我相信此代码中存在死锁的可能性:

  1. 线程A调用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.
  2. 线程B在线程A可以调用iValue之前调用P()V()的值为0,因此它进入while循环。
  3. 线程A现在尝试调用iValue,但不能,因为线程B持有锁。因此,存在僵局。
  4. 我的结论是否正确?

1 个答案:

答案 0 :(得分:3)

没有

当你wait锁定被释放时(等待结束后你会恢复锁定)。

Javadoc for wait

  

当前线程必须拥有此对象的监视器。该线程释放该监视器的所有权并等待,直到另一个线程通过调用notify方法或notifyAll方法通知等待该对象监视器的线程唤醒。然后线程等待,直到它可以重新获得监视器的所有权并继续执行。