jjzjj

Volatile

全部标签

java - 一个线程中对非 volatile 成员变量的赋值是否保证在另一个线程中可见?

考虑下面的Java示例。请注意,两个类成员变量都未声明为volatile。如果我正确理解内存模型和“先于发生”规则,Java实现可以优化run()方法,使其永远运行,即使另一个线程调用stopNow()方法。发生这种情况是因为run()方法中没有任何内容强制线程多次读取stop的值。那是对的吗?如果不是,为什么不呢?classExampleimplementsRunnable{booleanstop=false;intvalue=0;publicvoidstopNow(){stop=true;}publicintgetValue(){returnvalue;}@Overridepubl

java,线程何时(以及多长时间)可以缓存非 volatile 变量的值?

来自这篇文章:http://www.javamex.com/tutorials/synchronization_volatile_typical_use.shtmlpublicclassStoppableTaskextendsThread{privatevolatilebooleanpleaseStop;publicvoidrun(){while(!pleaseStop){//dosomestuff...}}publicvoidtellMeToStop(){pleaseStop=true;}}Ifthevariablewerenotdeclaredvolatile(andwithout

java - 并发、对象可见性

我想弄清楚下面的代码是否存在任何潜在的并发问题。具体来说,与volatile变量相关的可见性问题。Volatile定义为:此变量的值永远不会在线程本地缓存:所有读取和写入都将直接进入“主内存”publicstaticvoidmain(String[]args){Testtest=newTest();//ThiswillalwayssinglethreadedExecutorServiceex=Executors.newSingleThreadExecutor();for(inti=0;i对于上面的单线程执行器:让test.state不可变可以吗?换句话说,每个连续的Test.run()

java - 混合 volatile 和 synchronized 作为读写锁

考虑一个原始类型变量,有很多线程读取和一些线程写入,下面的代码能正常工作吗?如果会,它提供的性能是否优于1)。在所有方法上声明同步;2).使用显式ReadWriteLock?这是一个常见的模式吗?如果不是,这种情况通常使用什么模式?目前这对我来说效果很好,但我觉得同时使用volatile和synchronized有点多余。privatevolatileintvalue=1;publicvoidfunc1(){if(value==1){//dosomething}}publicvoidfunc2(){if(value==2){//dosomething}}publicvoidfunc3(

java - volatile + 不可变持有者对象 = 线程安全?

我有一个来自“javaconcurrencypratique”一书的例子,他说volatile和不可变的持有者对象提供了线程安全性。但是我不明白书上给出的例子。代码如下:publicclassVolatileCachedFactorizerextendsGenericServletimplementsServlet{privatevolatileOneValueCachecache=newOneValueCache(null,null);publicvoidservice(ServletRequestreq,ServletResponseresp){BigIntegeri=extrac

java - Java中如何正确使用volatile

我正在研究JavaThread,当我分析以下修改自Example8.3.1.4的代码时,关键字volatile让我感到困惑publicclassVolatile{publicstaticvoidmain(String[]args){MyRunnable1myRunnable1=newMyRunnable1();MyRunnable2myRunnable2=newMyRunnable2();Threadt1=newThread(myRunnable1);Threadt2=newThread(myRunnable2);t1.start();t2.start();}}classMyRunna

java - 我应该同步静态易失变量吗?

关于这个主题有几个问题,但大多数都绕过这个问题,因为这不是问题的意图。如果我的类中有静态volatile:privatestaticvolatileMyObjobj=null;在下面的方法中我这样做:publicMyObjgetMyObj(){if(obj==null){obj=newMyObj();//costlyinitialisation}returnobj;}我是否需要同步以确保只有一个线程写入该字段,或者任何写入是否立即对评估obj==null条件的其他线程可见?换句话说:volatile是否让您不必同步对静态变量的写入访问? 最佳答案

java - 引用类型的 volatile - 它是否总是避免由于 JMM 而发布引用问题?

假设这个类:publicclassAmIThreadSafe{privateinta;privateintb;AmIThreadSafe(inta,intb){this.a=a;this.b=b;}}假设一旦this(reference)转义,某些线程就可以访问该实例对此类的引用(声明为volatile)(导致竞争条件):volatileAmIThreadSafeinstance=newAmIThreadSafe(1,2);在这里,我确定分配实例引用的事实发生在线程读取之前。但是AmIThreadSafe的字段呢?外部volatile关键字是否也暗示了与a和b字段相关的happens-

一个熟悉又陌生的关键字:volatile

Hello,今天了不起带大家了解一下这个熟悉又陌生的关键字:volatile。在Java多线程编程中,保证线程安全性是至关重要的。而volatile关键字是实现线程安全性的一种关键机制。为什么熟悉又陌生呢?Java开发者几乎全都用到过这个关键字,但是又不记得什么时候用了它。1.volatile关键字的原理volatile关键字主要用于保证变量在多线程环境下的可见性和禁止指令重排序。当一个变量被volatile修饰时,线程在读取这个变量的值时将直接从主内存中读取,而不是从线程的本地缓存中读取。同样地,当一个线程修改了volatile变量的值时,这个变化将立即写回到主内存中,而不是仅仅保存在线程的

java - 为什么将 Java 变量标记为 volatile 会降低同步性?

因此,我刚刚在为我明天要学习的部分编写一些示例时了解了volatile关键字。我写了一个快速程序来证明++和--操作不是原子的。publicclassQ3{privatestaticintcount=0;privatestaticclassWorker1implementsRunnable{publicvoidrun(){for(inti=0;i正如预期的那样,这个程序的输出通常是这样的:-1521-39000000但是,当我改变时:privatestaticintcount=0;到privatestaticvolatileintcount=0;我的输出变为:030771-3365-1