变量的线程安全设置(Java)?
给出以下代码:
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参考变量的设置是否为原子?”。
(我也使它变得不稳定。这是一个不同的问题,与原子性无关(我的问题),而是与“其他线程中的可见性”以及之前发生的关系有关。)
回答:
替换引用是安全的。请参阅Java语言规范:
当线程使用变量的值时,它获得的值实际上是该线程或其他线程存储在变量中的值。即使程序不包含用于正确同步的代码,也是如此。例如,如果两个线程将对不同对象的引用存储到同一引用值中,则变量随后将包含对一个对象或另一个对象的引用,而不是对某个其他对象的引用或损坏的引用值。(长整数和双精度值有一个特殊的例外;请参见第17.4节。)
以上是 变量的线程安全设置(Java)? 的全部内容, 来源链接: utcz.com/qa/412321.html