8 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();
}
}
Run Code Online (Sandbox Code Playgroud)
Thread-Class将定期更新myConfigData Membervariable(每5分钟通过一个Executor).myConfigData的设置是在"外部"线程threadafe(原子)中,还是我必须将每个Read和Write操作同步到myConfigData变量?
编辑:问题不是ConcurrentHashMap是线程安全的(它是根据javadoc)而是在myConfigData Member变量中设置ConcurrentHashMap本身.这个变量可能被几个线程"一次"读取和写入,所以问题是设置是否是原子的.我认为这可以概括为"Java引用变量的设置是否为原子?".
(我也使它变得不稳定.这是一个不同的问题,与原子性无关 - 我的问题 - 而是"其他线程中的可见性"和之前发生的关系.)
Wol*_*ang 15
更换参考文献是安全的.请参阅Java语言规范:
当线程使用变量的值时,它获得的值实际上是由该线程或某个其他线程存储到变量中的值.即使程序不包含正确同步的代码,也是如此.例如,如果两个线程将对不同对象的引用存储到同一引用值中,则该变量随后将包含对一个对象或另一个对象的引用,而不是对某个其他对象的引用或损坏的引用值.(长值和双值有一个特殊例外;见§17.4.)