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

什么时候在Java中使用volatile布尔而不是AtomicBoolean更可取?

燕正卿
2023-03-14
问题内容

我已经看过SO中的其他volatile与Atomicxxxx问题(包括此问题),并阅读了java.util.current.atomic的描述,但我对细微差别并不满意。

如果我要决定在volatile boolean和之间使用AtomicBoolean,除了AtomicBoolean提供的原子读取-修改-写入操作之外,还有其他实际区别吗?(例如compareAndSet()getAndSet()

假设我有

volatile boolean flag;

然后,一个或多个线程设置该标志(但不清除它)。如果我有一个线程读取该标志,并且设置了该标志,则执行一个操作,然后清除该标志是否volatile足够?

就以下方面而言,AtomicBoolean是否比可变布尔值的成本更高?

  • 记忆空间
  • 性能下降(volatile boolean似乎需要内存隔离,AtomicBoolean似乎需要内存隔离+根据java.util.current.atomic描述对CAS操作进行一些较小的锁定)

我的直觉是只使用AtomicBoolean并保持安全,但是我想了解是否存在volatile boolean替代情况(例如,如果我有成千上万的实例,而性能是一个问题)。


问题答案:

基本上所有的AtomicBooleanvolatile boolean一个对象。

每个对象的开销很小。可能微不足道,但可能会有更多的内存进入缓存

如果您需要使用,AtomicBooleanFieldUpdater则会有很多性能开销,如果您不打算经常使用它(attach在NIO中)可以没问题。



 类似资料:
  • 问题内容: 我如何使用AtomicBoolean?该类的作用是什么? 问题答案: 当有多个线程需要检查并更改布尔值时。例如: 这不是线程安全的。您可以使用以下方法修复它:

  • 问题内容: 当喜欢过? 何时以及何时使用哪种数据结构: 您想要高效的读写 应该具有更少的内存占用 尽管存在类似的问题,但它并没有突出表明应该优先选择哪个事实? 问题答案: 蜘蛛侠鲍里斯(Boris the Spider)已经概述了和之间最明显的区别-前者始终是有界的,而后者可以是无界的。 因此,如果您需要无限制的阻塞队列,或者将其用作工具箱中的最佳选择。 但是,假设您需要一个有限的阻塞队列。最后,

  • 问题内容: 我的要求是仅显示跨数据库从数据库检索的一组值。我正在使用jQuery。 问题答案: 如果满足以下任一条件,则将XML优先于JSON: 您需要消息验证 您正在使用XSLT 您的消息中包含很多标记文字 您需要与不支持JSON的环境进行互操作 当所有这些都成立时,在XML上偏爱JSON: 不需要验证消息,或者验证消息的反序列化很简单 您不是要转换邮件,也不是转换邮件的反序列​​化很简单 您的

  • 我对Java编码非常陌生,我已经研究这个问题大约4天了。我正在做一个选择你自己的结局故事。当我到达第69行时,如果读者选择是,我希望系统重新开始故事,如果他们选择否,则结束程序。我不确定我是否正确地编码了while循环,或者我甚至可以使用中断;操作员就像我在使用它一样。对不起,我的代码太难看了,哈哈,我正在努力变得更好。感谢您的建议! }

  • 已弃用。这种方法本质上是不安全的。使用thread.Stop停止线程会导致它解锁它锁定的所有监视器(作为未检查的ThreadDeath异常向堆栈上传播的自然结果)。如果以前由这些监视器保护的任何对象处于不一致的状态,则损坏的对象将对其他线程可见,从而可能导致任意行为。stop的许多用法应该被简单修改某个变量以指示目标线程应该停止运行的代码所取代。目标线程应该定期检查这个变量,如果变量指示它要停止运

  • 问题内容: 我是一名C ++程序员,偶尔使用MySQL处理数据库,但是我的SQL知识非常有限。但是,我当然愿意改变这一点。 目前,我正尝试仅通过SQL查询对数据库中的数据进行分析(!)。但是我将放弃,而是将数据导入C 并使用C 代码进行分析。 我已经与同事讨论了这一点,他们也促使我使用C ++,他说SQL并不是用于复杂的分析,而是主要用于导入(从现有表中)和导出(到新表中)数据,还有更多内容。例如