我可以使用synchronized到最终字段吗?

ala*_*ska 5 java final synchronize

考虑下面的代码,我想让它成为一个线程安全类,以便它永远不会得到奇数:

class Test {
  private int value = 0;
  private final Object lock;

  public void add() {
    synchronized (lock) {
      value++;
      value++;
    }
  }

  public int getValue() {
    synchronized (lock) {
      return value;
    }
  } 
}
Run Code Online (Sandbox Code Playgroud)

我现在怀疑锁定领域,这被宣布为最终的,这有关系吗?或者它会打破线程的安全吗?

我认为如果锁定字段没有被声明为final,那么这应该是一个线程安全的类.如果这个结论有误,请指正,谢谢.

Pet*_*rey 9

我现在怀疑锁定领域,这被宣布为最终的,这有关系吗?

是的,它被认为是锁定final现场对象的最佳做法.

如果您可以更改引用,则可以更改锁定的对象,从而破坏线程安全性.