线程同步 - 犹豫模式

Threading synchronization - balking pattern

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

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

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

你把自己弄糊涂了:

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
    // ...
}

一模一样!