Java 锁定与直接更新

Java 锁定与直接更新,java,concurrency,thread-safety,Java,Concurrency,Thread Safety,我已经声明了一个枚举,这就是它的样子(不是真正的代码) 有多个线程可以访问MySession.INSTANCE.getMyFactory()并使用该工厂。 工厂是通过从输入流中读取文件创建的 用例是我需要以编程方式刷新这个工厂 问题: 有没有办法在工厂更新前锁定其访问权限?那会有多混乱 是否可以简单地按原样更新工厂而不进行任何锁定。这样做意味着什么 有没有办法在工厂更新前锁定其访问权限?那会有多混乱 您可以使getMyFactory和loadFactory同步 是否可以简单地按原样更新工厂而不进

我已经声明了一个枚举,这就是它的样子(不是真正的代码)

有多个线程可以访问MySession.INSTANCE.getMyFactory()并使用该工厂。 工厂是通过从输入流中读取文件创建的

用例是我需要以编程方式刷新这个工厂

问题:

有没有办法在工厂更新前锁定其访问权限?那会有多混乱

是否可以简单地按原样更新工厂而不进行任何锁定。这样做意味着什么

有没有办法在工厂更新前锁定其访问权限?那会有多混乱

您可以使
getMyFactory
loadFactory
同步

是否可以简单地按原样更新工厂而不进行任何锁定。这样做意味着什么


您需要将
myFactory
设置为volatile,以确保可以看到更改。这意味着您不需要任何其他操作来保证线程安全。i、 e.对于您拥有的代码,这很好。

替换以下代码片段:

private void loadFactory() {
    ...
    myFactory = factory;
}
private MyFactory myFactory;
public MyFactory getMyFactory() {
    return myFactory;
}
与:

private void loadFactory(){
...
myFactoryRef.set(工厂);
}
私有原子参考myFactoryRef;
公共MyFactory getMyFactory(){
返回myFactoryRef.get();
}
而且您不需要为任何额外的同步而烦恼。 确保变量的更新是原子的。
因此,其他调用
getMyFactory()
的线程将看到
MyFactory
的旧实例或新实例,并且在
loadFactory()
refreshMyFactory()
中不需要额外的同步,我可以使getMyFactory和loadFactory都同步,但是,假设ThreadB加载工厂时,它不一定会阻止ThreadA获取工厂,这公平吗?虽然Peter的回答相当简洁,但我会接受这个答案,因为它提供了一种更简单的方法来处理更新而不是使用volatile。
private void loadFactory() {
    ...
    myFactory = factory;
}
private MyFactory myFactory;
public MyFactory getMyFactory() {
    return myFactory;
}
private void loadFactory() {
    ...
    myFactoryRef.set(factory);
}
private AtomicReference<MyFactory> myFactoryRef;
public MyFactory getMyFactory() {
    return myFactoryRef.get();
}