知识大全 java多线程的volatile关键字

Posted

篇首语:读和写是学生最必要的两种学习方法,也是通向周围世界的两扇窗口。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 java多线程的volatile关键字相关的知识,希望对你有一定的参考价值。

  以前一直没在意 一直以为volatile修饰了就高枕无忧了 但其实不然 最简单的一个场景

  public class Counter

  public volatile static int count = ;

  public static void inc()

  //这里延迟 毫秒 使得结果明显

  try

  Thread sleep( );

   catch (InterruptedException e)

  

  count++;

  

  public static void main(String[] args)

  //同时启动 个线程 去进行i++计算 看看实际结果

  for (int i = ; i < ; i++)

  new Thread(new Runnable()

  @Override

  public void run()

  Counter inc();

  

  ) start();

  

  //这里每次运行的值都有可能不同 可能为

  System out println( 运行结果:unt= + unt);

  

  

  这里运行结果依然不是期望的 主要原因简单解释如下

  对于volatile修饰的变量 jvm虚拟机只是保证从主内存加载到线程工作内存的值是最新的

  例如假如线程 线程 在进行read load 操作中 发现主内存中count的值都是 那么都会加载这个最新的值

  在线程 堆count进行修改之后 会write到主内存中 主内存中的count变量就会变为

  线程 由于已经进行read load操作 在进行运算之后 也会更新主内存count的变量值为

cha138/Article/program/Java/gj/201311/27567

相关参考