线程同步 - balking模式

时间:2015-05-26 12:39:07

标签: c# multithreading thread-safety

 public class Example {
    private boolean jobInProgress = false;

    public void job() {
        lock(this) {
           if (jobInProgress) {
               return;
           }
           jobInProgress = true;
        }
        // Code to execute job goes here
        // ...
    }

    void jobCompleted() {
        lock(this) {
            jobInProgress = false;
        }
    }
}

我从维基百科获得了这段代码,我有一件事我不确定。

为什么在return语句之后没有在锁定块内设置jobInProgress = true;?为了更明确,我将尝试给出一个场景:

  • 一个线程获得锁定而其他线程正在等待
  • 它释放锁但在执行jobInProgress = true;之前,其中一个等待线程获取锁并测试仍为false的条件。 这是一个可行的方案还是我没有得到正确的执行流程?

1 个答案:

答案 0 :(得分:2)

你自己很困惑:

lock(this) {
    if (jobInProgress) {
        return;
    } // <= closing brace of if

    // INSIDE LOCK, OUTSIDE IF
    jobInProgress = true;
} // <= closing brace of lock

我会注意到wiki

public void job() {
    synchronized(this) {
       if (jobInProgress) {
           return;
       }

       // INSIDE LOCK, OUTSIDE IF
       jobInProgress = true;
    }
    // Code to execute job goes here
    // ...
}

它完全一样!