如何确保Java中的内存可见性?

如何确保Java中的内存可见性?,java,multithreading,concurrency,thread-safety,Java,Multithreading,Concurrency,Thread Safety,我有一个这样的程序: private static Map<String, PoolObject> objects = new ConcurrentHashMap<>(); // Called from up to 4 different threads public static PoolObject getObject(String id) { return objects.get(id); } // Called from only one dedica

我有一个这样的程序:

private static Map<String, PoolObject> objects = new ConcurrentHashMap<>();

// Called from up to 4 different threads
public static PoolObject getObject(String id) {
    return objects.get(id);
}

// Called from only one dedicated thread
public static void addObject(String id, PoolObject object) {
    objects.put(id, object);
}

public static class PoolObject {
    private int a, b c;
    private String someString;
    ...
}
私有静态映射对象=新的ConcurrentHashMap();
//最多从4个不同线程调用
公共静态池对象getObject(字符串id){
返回objects.get(id);
}
//仅从一个专用线程调用
公共静态void addObject(字符串id,池对象){
objects.put(id,object);
}
公共静态类池对象{
私人INTA、b、c;
私有字符串someString;
...
}

任何PoolObject中的字段都是从同样调用addObject()的专用线程修改的。如何确保对PoolObject内字段的更新对所有读卡器线程可见?我无法修改程序中的PoolObject类,因为它是外部库的一部分。

最简单的方法是使用
synchronized
方法为
PoolObject
编写一个包装类,或者如果只有很少的地方可以进行修改,则使用
synchronized(PoolObject){}

最简单的方法是使用
同步的
方法为
PoolObject
编写一个包装类,或者如果只有很少的地方可以进行修改,则使用
同步的(PoolObject){}

来包装它们,PoolObject被更改,而其他线程当前可能正在使用它?基本思想是您需要保证写入和读取之间的“发生在之前”关系。一种方法是使用锁。如果需要关于如何更新和读取字段的具体建议,请显示用于更新和读取字段的代码。仅在对象不包含在映射中时更新对象。您的意思是,池对象已更改,而其他线程当前可能正在使用它?基本思想是您需要保证写入和读取之间的“发生在之前”关系。一种方法是使用锁。如果您需要关于如何更新和读取字段的具体建议,请显示用于更新和读取字段的代码。仅在对象不包含在映射中时更新对象。