当前位置: 首页 > 面试题库 >

变量的线程安全设置(Java)?

邵璞
2023-03-14
问题内容

给出以下代码:

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节。)



 类似资料:
  • 我的问题与静态变量的线程安全有关。 如果两个线程,t1具有静态锁,t2具有对象锁,可以同时继续,那么A类的状态测试将如何是线程安全的呢? 可能是,我错过了一些非常基本的东西,但不确定它是如何工作的。 根据下面的答案,我得到的印象是,如果必须使这些状态成为线程安全的,那么两个锁都应该由正在更新此状态的线程持有,或者确保它被仅静态方法或仅非静态方法访问。对吧?

  • 问题内容: 假设我有两个线程在更新一个对象,一个线程在不同步的情况下从该对象读取。显然,这是运行条件。但是,我想知道变量本身是否只能部分写入。 我假设打印出的值也将是2或1。但是,我想知道变量是否可能设置为一半? 我以原语为例,但如果对象不同,我希望答案也适用于对象。 问题答案: 这取决于变量的类型。 s和s(Java中的两种64位类型)如果不是,则允许字眼翻译,而所有其他类型(包括引用)可能永远

  • 问题内容: 我是Go的新手,我需要创建一个线程安全的变量。我知道在Java中您只能使用关键字,但是似乎没有类似的东西存在。有什么方法可以同步变量? 问题答案: Java中的一种意思是仅允许单个线程(在任何给定时间)执行代码块。 在Go中,有很多构造可以实现该目标(例如互斥体,通道,等待组,中的原语),但是Go的谚语是: “不要通过共享内存进行通信;而是通过通信来共享内存。” 因此,不要锁定和共享变

  • These are used to override or specify the security settings when security is enabled. These are the possible settings: 用于当启动安全变量时覆盖或另行指定安全配置.有以下几种可能的配置: PHP_HANDLING - true/false. If set to true, the

  • 关于一次从多个线程访问局部变量的几个问题: > < li> 我有多个线程写入和读取变量值,我是否应该同步访问它? 变量每隔几秒钟从 Thread1 更新一次,每隔几秒钟从 Thread2 读取和更新到数据库。 如果我没有任何逻辑并且没有任何并发问题,会出现哪些问题? 我应该为此使用volatile吗? 编辑: 我想强调的是,我没有任何并发问题。这是我的具体方案: 一个。我的变量名称是 ,它测量 p

  • 我使用的是swing,有一个函数(CreateAndShowGUI())可以监听上、左、右键的按下 现在,当我运行程序并按下任意键(向上、向左、向右、向下)时,我可以看到按下的键变量被设置为True。但当我试图在main中访问相同的内容时,按下的这个键的值为false。谁能帮我找出我错的地方吗?