给出以下代码:
public class FooBar {
public static volatile ConcurrentHashMap myConfigData = new ConcurrentHashMap();
}
public class UpdaterThread implements Runnable {
public void run() {
//Query the Data from the DB and Update the FooBar config Data
FooBar.myConfigData = ConfigDataDAO.getLatestConfigFromDB();
}
}
线程类将定期(通过执行器每5分钟更新一次)myConfigData成员变量。myConfigData的设置是否在“外部”线程中是线程安全的(原子的),还是我必须将每个读写操作都同步到myConfigData变量?
编辑:问题不是ConcurrentHashMap是否是线程安全的(根据Javadoc),而是ConcurrentHashMap本身在myConfigData
Member变量中的设置。几个线程可能会“一次”读取和写入此变量,因此问题是设置是否为原子的。我认为这可以概括为“ Java参考变量的设置是否为原子?”。
(我也使它变得不稳定。这是一个不同的问题,与原子性无关(我的问题),而是与“其他线程中的可见性”以及之前发生的关系有关。)