当它适合使用volatile
原语(例如boolean
,integer
或long
),而不是AtomicBoolean
,AtomicInteger
或者AtomicLong
,反之亦然?
可见性语义完全相同,当需要使用原子原语时,使用原子原语很有用。
例如:
if (volatileBoolean) {
volatileBoolean = !volatileBoolean;
}
可能在多线程环境中产生问题,因为变量可能会在两行之间变化。如果您需要测试和分配是原子的,则可以使用:
atomicBoolean.compareAndSet(true, false);
来自Javadocs 使用易失性变量降低了内存一致性错误的风险,因为对易失性变量的任何写入都与同一变量的后续读取建立了先发生后发生的关系。这意味着对易失性变量的更改始终对其他线程可见。 如果对volatile变量所做的更改对任何其他线程都是可见的,那么为什么在多个线程写入该变量的情况下不能使用volatile变量呢。为什么volatile只用于一个线程正在写入或读取该变量,而另一个线程只读取该变量
我从《实践中的Java并发》(Java Concurrency in Practice)一书中读到了以下关于volatile的内容: 当一个字段被声明为volatile时,编译器和运行时会注意到这个变量是共享的,对它的操作不应该与其他内存操作一起重新排序。易失性变量不会缓存在寄存器或缓存中,在这些寄存器或缓存中它们对其他处理器是隐藏的,因此对易失性变量的读取总是返回任何线程最近的写入。 可变变量的
本文向大家介绍详解易语言变量用法和原理,包括了详解易语言变量用法和原理的使用技巧和注意事项,需要的朋友参考一下 易语言是一款可视全中文的编程语言,由于他的简单易用,深受国人喜欢,下面我来为大家介绍易语言变量的用法. 易语言变量,就像是数学中设x一样,顾名思义它是不定值的,它分为局部变量,全局变量,和程序集变量,下面我为用一个程序来向大家介绍这3种变量的区别. 打开易语言,新建一个windows窗口
我对何时使用什么原语有点困惑。如果定义一个数字,如何知道使用、、或?我知道它们是不同的字节,但这是否意味着我只能对某个数字使用其中的一个呢? 所以简单地说,我的问题是,我什么时候使用上面列出的四个原语中的每一个?
我已经读到,使引用变量易失性,并不会使其内部字段易失性。但我尝试了下面的示例,其中看起来易失性也应用于类的内部字段。 使用者java:-//字段“flag”设置为true的用户类。 MyRunnableThread1。java:- 在这里,我将“user”设置为volatile,而不是将其内部字段“flag”设置为volatile 子线程在“while(this.user.isFlag())”处连
读了很多关于易失性、原子性和可见性的文章后,有一个问题仍然存在。以下跨线程工作,当更新/读取“B”时,“A”始终可见: 原子变量是独立的对象,这同样适用吗?下面的操作会起作用吗? 如果答案是否定的,那么扩展AtomicInteger类并在其中包含“a”就可以了,因为AtomicInteger包装了一个volatile。