知识大全 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

相关参考