jjzjj

Volatile

全部标签

java - 如何反编译Java中的volatile变量?

我听说volatile关键字可以在变量的写操作之前添加内存屏障。所以我写了代码:publicclassTest{privateObjecto;publicTest(){this.o=newObject();}privatevolatilestaticTestt;publicstaticvoidcreateInstance(){t=newTest();//volatilewouldinsertmemorybarrierhere.}publicstaticvoidmain(String[]args)throwsException{Test.createInstance();}}然后反编译:

java - 并发实践 - volatile++

在ConcurrencyinPractice中,它说如果Writestothevariabledonotdependonitscurrentvalue.因此,如果您有一个共享的可变变量a,并且所有线程对它执行的操作都是a++(它们不获取值,它们只是++)。然后根据引用,即使a++不是原子的,您也应该能够使其成为volatile,对吗? 最佳答案 不,在volatile变量上使用++不是线程安全的,因为a++相当于:inttemp=a;temp=temp+1;a=temp;所以回写到a可能发生在另一个线程修改了a因为你的线程读取了它,

c# - 具有释放/获取语义的 volatile

从Java5开始,volatile关键字具有释放/获取语义,使副作用对其他线程可见(包括对非volatile变量的赋值!)。以这两个变量为例:inti;volatileintv;请注意,i是一个常规的非volatile变量。想象线程1执行以下语句:i=42;v=0;在稍后的某个时间点,线程2执行以下语句:intsome_local_variable=v;print(i);根据Java内存模型,在线程1中写入v后在线程2中读取v可确保线程2看到写入i在线程1中执行,因此打印值42。我的问题是:volatile在C#中是否具有相同的释放/获取语义? 最佳答案

java - 我们可以在 Java 中使用原子枚举吗?

今天我看到了这个用于AtomicEnum的实用程序类,但我想知道是否可以有一个原子枚举,为什么它不包含在Java标准库中?事实上,我非常怀疑它是否真的是原子的,以及这个实用程序类是否有效。AtomicEnum类是this我如何检查它是否以原子方式执行操作?是否有一种工具可以查看编译后的代码并确保它确实做到了一条机器指令?是否可以从代码中发现?因此,如果这个Atomic枚举有效,我就可以拥有一个AtomicEnum属性,并且可以在没有volatile关键字和同步getter和setter的情况下安全地使用它? 最佳答案 TodayIs

java - 如果您将对象分配给最终字段,其他线程是否会看到该对象的非最终/非 volatile 字段的先前更新?

阅读Java语言规范时,我发现了这段关于final字段的摘录:Theusagemodelforfinalfieldsisasimpleone:Setthefinalfieldsforanobjectinthatobject'sconstructor;anddonotwriteareferencetotheobjectbeingconstructedinaplacewhereanotherthreadcanseeitbeforetheobject'sconstructorisfinished.Ifthisisfollowed,thenwhentheobjectisseenbyanothe

java - 如何在没有 volatile 的情况下打破双重检查锁定

我知道doublechecklockingwithoutvolatilevariableisnotsafe基于此链接http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.htmlclassFoo{privateHelperhelper=null;publicHelpergetHelper(){if(helper==null){synchronized(this){if(helper==null){helper=newHelper();}}}returnhelper;}}我想在家里的电脑上模拟这种情况。我有标准

java - volatile 关键字和内存一致性错误

在oracleJava文档中locatedhere,下面说:Atomicactionscannotbeinterleaved,sotheycanbeusedwithoutfearofthreadinterference.However,thisdoesnoteliminateallneedtosynchronizeatomicactions,becausememoryconsistencyerrorsarestillpossible.Usingvolatilevariablesreducestheriskofmemoryconsistencyerrors,becauseanywrite

java - 完全 volatile 可见性保证

我正在阅读一篇关于JavaVolatile关键字的文章,遇到了一些问题。clickherepublicclassMyClass{privateintyears;privateintmonthsprivatevolatileintdays;publicvoidupdate(intyears,intmonths,intdays){this.years=years;this.months=months;this.days=days;}}udpate()方法写入了三个变量,其中只有days是volatile的。完整的volatile可见性保证意味着,当一个值被写入days时,线程可见的所有变量

java - volatile 变量并刷新到主内存/从主内存读取

官方注释说,那Writingtoavolatilefieldhasthesamememoryeffectasamonitorrelease,andreadingfromavolatilefieldhasthesamememoryeffectasamonitoracquire.和Effectively,thesemanticsofvolatilehavebeenstrengthenedsubstantially,almosttothelevelofsynchronization.Eachreadorwriteofavolatilefieldactslike"half"asynchroni

java - 同步的、易变的和线程安全的

我最近在看一些关于java并发的书。关于线程安全,如果无法使类不可变,则始终可以通过同步其数据来确保线程安全。下面的类显然不是线程安全的publicclassNotThreadSafe{privateintvalue;publicvoidsetValue(intvalue){this.value=value;}publicintgetValue(){returnthis.value;}}然后我可以同步写入,但它仍然不是线程安全的publicclassStillNotThreadSafe{privateintvalue;publicsynchronizedvoidsetValue(int