澄清参数块同步的含义

Oxe*_*arf 0 java synchronized

我想知道这个表达式是否正确,如果它意味着:我对字段状态进行了写锁定,而不是更改它.如果没有,我想知道参数的含义是什么,因为我总是这样看.

public class Example {
    private int status;
    public Example(int status){
        this.status = status;
    }
    public void setStatus(int newStatus){
        synchronized(this.status){
            this.status = newStatus;
        }
     }
}
Run Code Online (Sandbox Code Playgroud)

Old*_*eon 5

这段代码有几个问题:

  1. 你不能synchronize在一个原始的.

    你可以把它改成一个Integer,但见下文.

  2. 在非最终对象上同步不是一个好主意.

    你可以做到 final

  3. 在一个字段synchronized开启时更改字段将以一些非常模糊的方式中断.而现在它是final不允许的.

    可能更好地在另一个领域同步.

  4. 您还应该提供完整性的get方法.

修复了所有这些问题,您的代码看起来像这样:

public class Example {
  private final Object statusLock = new Object();
  private Integer status;

  public Example(Integer status) {
    this.status = status;
  }

  public void setStatus(Integer newStatus) {
    synchronized (statusLock) {
      status = newStatus;
    }
  }


  public Integer getStatus() {
    return status;
  }
}
Run Code Online (Sandbox Code Playgroud)

现在 - 使用此代码 - 您的问题的答案是那样的.这里发生的是当您更改其值时,通过set方法从任何其他线程锁定对该字段的所有访问.status

请注意,我没有在get方法中进行同步.如果我这样做,那么上述陈述就会改变.