jjzjj

volatility

全部标签

java - 用锁保护非 volatile 字段的初始化?

出于教育目的,我正在编写一个简单版本的AtomicLong,其中一个内部变量由ReentrantReadWriteLock保护。这是一个简化的示例:publicclassPlainSimpleAtomicLong{privatelongvalue;privatefinalReentrantReadWriteLockrwLock=newReentrantReadWriteLock();publicPlainSimpleAtomicLong(longinitialValue){this.value=initialValue;}publiclongget(){longresult;rwLoc

java - volatile 为什么以及如何暗示原子读/写?

首先,我知道volatile不会使多个操作(如i++)成为原子操作。这个问题是关于单个读取或写入操作。我最初的理解是volatile只强制执行内存屏障(即其他线程将能够看到更新的值)。现在我注意到JLSsection17.7说volatile还使单个读取或写入成为原子。例如,给定两个线程,都将不同的值写入volatilelongx,那么x最终将恰好代表其中一个值。我很好奇这怎么可能。在32位系统上,如果两个线程并行写入64位位置并且没有“适当的”同步(即某种锁),结果可能会混淆。为清楚起见,我们使用一个示例,其中线程1写入0L而线程2将-1L写入相同的64位内存位置。T1writesl

java - 在什么情况下其他线程看不到对非 volatile 变量的写入?我可以出于实验目的强制这样的条件吗?

我最近在SO和其他地方阅读了很多关于线程内存管理的内容,特别是volatile关键字的使用。我开始对这个概念有相当的信心,但是,为了充分理解它的效果,我想尝试运行一些实验来说明它。这是我的设置:我有一个生产者线程(它从麦克风读取音频数据,与我的previousquestion相关,但实际数据并不重要),它以byte[]到一个单独的消费者线程。线程之间共享数据的方式是我实验中的主要变量:我尝试了一个ArrayBlockingQueue;我尝试了一个共享的volatilebyte[]引用(使用array=array自引用,如thisblogpost中所推荐);我还尝试了一个没有自引用的普通

java - 如果从 2 个线程写入 volatile 变量会怎样?

考虑Java并发实践中的片段-@ThreadSafepublicclassSynchronizedInteger{@GuardedBy("this")privateintvalue;publicsynchronizedintgetValue(){returnvalue;}publicsynchronizedvoidsetValue(intvalue){this.value=value;}}同一本书的摘录-AgoodwaytothinkaboutvolatilevariablesistoimaginethattheybehaveroughlyliketheSynchronizedInte

java - java 中的 volatile 与 threadLocal

让我们以SimpleDateFormat为例,因为它不是线程安全的。我可以像这样使用threadLocal允许每个线程拥有自己的SimpleDateFormat副本:privatestaticfinalThreadLocalformatter=newThreadLocal(){@OverrideprotectedSimpleDateFormatinitialValue(){returnnewSimpleDateFormat("yyyyMMddHHmm");}};但是volatile关键字保证线程将拥有变量的最新副本。所以我可以不这样做吗:volatileSimpleDateFormat

java - 在仅同步访问的情况下是否需要 volatile

这个问题在这里已经有了答案:Java-isvolatilerequiredwithsynchronized?(2个答案)关闭7年前。emitting变量应该是可变的吗?emit()方法从不同的线程调用,并且emit必须是可见的。但它只能在synchronizedblock中访问。//...是完成工作的地方,但是这里没有引用emitting。那么,如果synchronized的结构是固定的,我还需要一个volatile来emitting吗?(为什么?)staticfinalclassC{booleanemitting=false;//shallbevolatile?publicvoide

Java volatile 和副作用

Oracle关于原子访问的文档(位于http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html)是这样说的:"avolatilevariableestablishesahappens-beforerelationship....Thismeansthat...whenathreadreadsavolatilevariable,itseesnotjustthelatestchangetothevolatile,butalsothesideeffectsofthecodethatledupthechang

java - 静态变量与 volatile 变量

我只是从线程的角度提问……可能已经回答了很多次,但请帮助我理解这一点。引用这里发帖VolatileVsStaticinjava要求静态变量值也是所有线程的一个值,那我们为什么要选择volatile呢?我找到了以下示例:publicclassVolatileExample{publicstaticvoidmain(Stringargs[]){newExampleThread("Thread1").start();newExampleThread("Thread2").start();}}classExampleThreadextendsThread{privatestaticvolati

java - 将字段设置为 `volatile` 是否可以防止并发情况下的所有内存可见性问题?

使类字段volatile是否可以防止并发情况下的所有内存可见性问题?对于下面的类,获取Test对象引用的线程是否有可能首先将x视为0(int的默认值)然后10?我认为这是可能的当且仅当Test的构造函数在未完成(不正确的发布)的情况下放弃了this引用。有人可以验证/纠正我吗?classTest{volatileintx=10;}第二个问题:如果是finalintx=10;怎么办? 最佳答案 根据JMM,您实际上不能保证看到x=10。例如,如果你有Testtest=null;Thread1->test=newTest();Threa

Java volatile 变量的行为不正确。

publicclassMyThread{volatilestaticinti;publicstaticclassmyTextendsThread{publicvoidrun(){intj=0;while(j由于volatile建立happens-before关系,所以i的最终值应该严格为2000000。但是,实际结果与变量i没有volatile没有什么不同。谁能解释为什么它在这里不起作用?由于i被声明为volatile,因此应该防止内存不一致。 最佳答案 Cananyoneexplanationwhyitdoesn'tworkher