【问题标题】:Threading synchronization - balking pattern线程同步 - 阻碍模式
【发布时间】:2015-05-26 12:39:07
【问题描述】:
 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;
        }
    }
}

我从 Wikipedia 获得了这段代码,但我有一件事我不确定。

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

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

【问题讨论】:

    标签: c# multithreading thread-safety


    【解决方案1】:

    你自己搞糊涂了:

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

    一模一样!

    【讨论】:

    • 啊,该死的,我把括号全弄错了。谢谢你解决了我的失明问题。
    猜你喜欢
    • 2011-04-16
    • 2017-08-13
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    相关资源
    最近更新 更多