jjzjj

Volatile

全部标签

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

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

java - 使用修饰符创建不可变类的好方法(线程安全)

我有一个案例,当我想避免防御性副本时,对于可能仍然被修改但通常只是读取而不是写入的数据。所以,我想使用不可变对象(immutable对象),使用函数式修改器方法,这很常见(javalombok能够或多或少地自动完成)。我的处理方式如下:publicclassPerson{privateStringname,surname;publicPerson(Stringname,Stringsurname){....}//getters...//andinsteadofsetterspublicPersonwithName(Stringname){Personp=copy();//createa

java - Guava:MemoizingSupplier 线程安全

GuavaSuppliers类包含MemoizingSupplier:staticclassMemoizingSupplierimplementsSupplier,Serializable{finalSupplierdelegate;transientvolatilebooleaninitialized;//"value"doesnotneedtobevolatile;visibilitypiggy-backs//onvolatilereadof"initialized".transientTvalue;MemoizingSupplier(Supplierdelegate){this.

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。但这种信念最近受到了一位队友的挑战。我们正在尝试确定在以下情况下是否需要volatile。classClass1{voidMethod1(){Workerworker=newWorker();worker.start();...System.out.println(worker.value);//wanttopollvalueatthisinstant...}classWorkerextendsThread{intvalue=0;//Shouldthisbedeclaredasavolatile