知识大全 java的volatile与多线程
Posted 变量
篇首语:弓背霞明剑照霜,秋风走马出咸阳。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 java的volatile与多线程相关的知识,希望对你有一定的参考价值。
Java语言规范中指出 为了获得最佳速度 允许线程保存共享成员变量的私有拷贝 而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比
Volatile修饰的成员变量在每次被线程访问时 都强迫从共享内存中重读该成员变量的值 而且 当成员变量发生变化时 强迫线程将变化值回写到共享内存 这样在任何时刻 两个不同的线程总是看到某个成员变量的同一个值
下面是个例子 恢复注释的任何一处都可以实现同步 就是让程序停下来
Java代码
import ncurrent TimeUnit;
// Broken! How long would you expect this program to run ?
public class StopThread
// private static volatile boolean stopRequested; // value: false
private static boolean stopRequested; // value: false
public static void main(String args) throws InterruptedException
Thread backgroundThread = new Thread(new Runnable()
public synchronized void test ()
@Override
public void run()
int i = ;
while(!stopRequested)
// test();
i++;
);
backgroundThread start();
TimeUnit SECONDS sleep( );
stopRequested = true;
当然最容易理解的是用同步的方法
Java代码
import ncurrent TimeUnit;
// Broken! How long would you expect this program to run ?
public class StopThread
private static boolean stopRequested; // value: false
public static synchronized void requestStop()
stopRequested = true;
public static synchronized boolean stopRequested()
return stopRequested;
public static void main(String args) throws InterruptedException
Thread backgroundThread = new Thread(new Runnable()
@Override
public void run()
int i = ;
while(!stopRequested())
i++;
);
backgroundThread start();
TimeUnit SECONDS sleep( );
requestStop();
cha138/Article/program/Java/gj/201311/27280
相关参考