whenathreadreadsavolatilevariable,itseesnotjustthelatestchangetothevolatile,butalsothesideeffectsofthecodethatledupthechange这在http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html中提到有人可以提供这方面的例子吗?这首先给我的印象是读取volatile变量的线程会和writer线程同步,等待写入完成。但事实显然并非如此。一个例子会很有帮助,不胜感激。谢谢,穆斯塔法
我正试图牢牢把握一个变量如何声明为privatevolatileHashMap>data;将在多线程环境中运行。我的理解是volatile意味着从主内存而不是从线程缓存中获取。这意味着如果正在更新一个变量,在更新完成之前我不会看到新值并且我不会阻止,而是我看到的是最后更新的值。(顺便说一句,这正是我想要的。)我的问题是何时检索ArrayList并在线程B读取时在线程A中添加或删除字符串,volatile到底影响了什么?关键词?HashMap仅或影响扩展到HashMap的内容(K和V)还有吗?那是线程B获得ArrayList的时候当前正在线程A中修改实际返回的是ArrayList的最后一
在java4和java5之后使用volatile关键字有什么区别?与此相关的是,Read/writeoperationsonnon-atomicvariables(long/double)areatomicwhentheyaredeclaredasvolatile.对于java4也是这样还是它从java5开始有效??? 最佳答案 是的,有区别。直到Java4volatile可以由编译器根据之前的任何读取或写入重新排序,从而导致细微的并发错误,例如使得无法实现doublecheck锁定(Singleton的非常常见的习惯用法)。这在J
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我对Java中volatile关键字的用法感到困惑。我在互联网上阅读了很多文章,但仍然一无所获。我脑子里有很多问题想问:首先,维基百科和许多博客都说所有volatile变量都存储在所有线程共享的主内存之上的Thread-Local内存中!我有点困惑,它们是指stackmemory吗?我知道每个线程都有自己的堆栈内存,它存储自己的原始文字和对象引用。如果是这
我的课上有以下内容:privatestaticvolatilebytecounter=0;publicstaticbytegetCounter(){returncounter;}getCounter的调用是原子的还是非原子的? 最佳答案 是的,这是一个原子操作,从某种意义上说,没有重新排序或计时会导致字节在部分写入的同时被读取。如果字节在读取时被重新分配,则getter保证返回之前或之后的值,但没有其他值,即使没有volatile。但是,您必须在double或long值上使用volatile以避免读取既不是旧值也不是新值的不一致读取
通过阅读Java并发实践我能看到:要安全地发布对象,对象的引用和对象的状态必须同时对其他线程可见。正确构造的对象可以通过以下方式安全发布:从静态初始化程序初始化对象引用将对它的引用存储到volatile字段或AtomicReference将对它的引用存储到正确构造的对象的最终字段中将对它的引用存储到一个由锁。但是,我对第二个成语感到困惑。由于volatile只能保证引用对另一个线程可见,但它不同步它引用的对象构造。那么它如何保证可变对象被正确构造,正在构造这个对象的线程被另一个线程中断了? 最佳答案 我们需要证明构造一个对象并将其分
我需要一个在Java中使用volatile关键字的简单示例,由于未使用volatile而导致行为不一致。volatile用法的理论部分对我来说已经很清楚了。 最佳答案 首先,由于非volatile变量,没有保证公开缓存的方法。您的JVM可能一直对您非常友善,并且有效地将每个变量都视为易变的。话虽如此,有几种方法可以增加让线程缓存自己版本的非volatile变量的可能性。这是一个程序,它揭示了volatile在我测试过的大多数机器中的重要性(来自here的改编版本):classTestextendsThread{booleankeep
这个问题在这里已经有了答案:Whymakeamethodvolatileinjava?(7个答案)关闭8年前。这个很奇怪。我有以下代码:classA{protectedAclone()throwsCloneNotSupportedException{return(A)super.clone();}}当我通过“showmycode.com”反编译它的字节码时,它向我展示了以下代码:classA{A(){}protectedAclone()throwsclonenotsupportedexception{return(A)super.clone();}protectedvolatileob
我听说volatile关键字可以在变量的写操作之前添加内存屏障。所以我写了代码:publicclassTest{privateObjecto;publicTest(){this.o=newObject();}privatevolatilestaticTestt;publicstaticvoidcreateInstance(){t=newTest();//volatilewouldinsertmemorybarrierhere.}publicstaticvoidmain(String[]args)throwsException{Test.createInstance();}}然后反编译:
在ConcurrencyinPractice中,它说如果Writestothevariabledonotdependonitscurrentvalue.因此,如果您有一个共享的可变变量a,并且所有线程对它执行的操作都是a++(它们不获取值,它们只是++)。然后根据引用,即使a++不是原子的,您也应该能够使其成为volatile,对吗? 最佳答案 不,在volatile变量上使用++不是线程安全的,因为a++相当于:inttemp=a;temp=temp+1;a=temp;所以回写到a可能发生在另一个线程修改了a因为你的线程读取了它,