当前位置: 首页 > 知识库问答 >
问题:

原子变量的可见性保证

钱青青
2023-03-14

读了很多关于易失性、原子性和可见性的文章后,有一个问题仍然存在。以下跨线程工作,当更新/读取“B”时,“A”始终可见:

int a;
volatile int b;
a = 1; b = 1;
...
// different thread
if (b == 1) // do something with a, which is 1 now

原子变量是独立的对象,这同样适用吗?下面的操作会起作用吗?

int a;
AtomicInteger b = new AtomicInteger();
a = 1; b.set(1);
...
// different thread
if (b.get() == 1) // a guaranteed to be 1 here all the time ???

如果答案是否定的,那么扩展AtomicInteger类并在其中包含“a”就可以了,因为AtomicInteger包装了一个volatile。

共有1个答案

颛孙星海
2023-03-14

a保证在这里一直是1???

否,其他set调用可以在两者之间发生。

但在volatile情况下也是如此。

 类似资料:
  • 我从《实践中的Java并发》(Java Concurrency in Practice)一书中读到了以下关于volatile的内容: 当一个字段被声明为volatile时,编译器和运行时会注意到这个变量是共享的,对它的操作不应该与其他内存操作一起重新排序。易失性变量不会缓存在寄存器或缓存中,在这些寄存器或缓存中它们对其他处理器是隐藏的,因此对易失性变量的读取总是返回任何线程最近的写入。 可变变量的

  • 问题内容: 如果长变量声明为:- 私有易失性长计数器= 0; 现在,如果我使用预增量运算符对其进行增量,那么该操作将是原子的吗? 如果是,那么它将比对象的增量效率更高吗? 问题答案: 关键字只能解决可见性问题。您必须使用或方法/块来实现原子性(并发编程中的原子性)。 今天又发表了一篇文章:演示何时需要挥发物

  • 本文向大家介绍Java原子变量类常见问题解决,包括了Java原子变量类常见问题解决的使用技巧和注意事项,需要的朋友参考一下 在学习多线程时,遇到了原子变量类,它是基于 CAS 和 volatile 实现的,能够保障对共享变量进行 read-modify-write 更新操作的原子性和可见性。于是我就写了一段代码试试,自认为非常正确。 用五个线程并发获得ID,每个线程获取100个,最后应该输出100

  • 问题内容: 参考以下链接:http : //docs.python.org/faq/library.html#what- kinds-of-global-value-mutation-are-thread- safe 我想知道以下情况: 在cPython中将保证是原子的。(x和y都是python变量) 问题答案: 让我们来看看: 它不会出现,他们是原子:x的和y的值可以被另一个线程之间改变字节码,

  • 问题内容: 在Objective-C中,您可以区分原子性质和非原子性质: 根据我的理解,您可以安全地从多个线程读取和写入定义为原子的属性,而同时从多个线程中写入和访问非原子属性或ivars可能导致不确定的行为,包括严重的访问错误。 因此,如果您在Swift中有这样的变量: 我可以安全地并行读写该变量吗?(不考虑这样做的实际含义)。 问题答案: 假设尚无底层文档,这还为时尚早,但是您可以从汇编中学习

  • 我在我的项目中使用spring security。 我有更改登录的功能。为了实现这个目标,我使用以下代码 但现在我正在详细研究这段代码,并看到身份验证字段不是易变的,因此不保证可见性: 我应该用自己的同步来包装代码以实现可见性吗? 我读过https://stackoverflow.com/a/30781541/2674303 在单个会话中接收并发请求的应用程序中,相同的SecurityContex