Java内存模型(Java Memory Model)
  Java内存模型(JMM),不同于Java运行时数据区,JMM的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中读取数据这样的底层细节。JMM规定了所有的变量都存储在主内存中,但每个线程还有自己的工作内存,线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝。线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量,工作内存是线程之间独立的,线程之间变量值的传递均需要通过主内存来完成。
  Volatile关键字
  平时在阅读jdk源码的时候,经常看到源码中有写变量被volatile关键字修饰,但是却不是十分清除这个关键字到底有什么用处,现在终于弄清楚了,那么我来讲讲这个volatile到底有什么用吧。
  当一个变量被定义为volatile之后,可以保证此变量对所有线程的可见性,即当一个线程修改了此变量的值的时候,变量新的值对于其他线程来说是可以立即得知的。可以理解成:对volatile变量所有的写操作都能立刻被其他线程得知。但是这并不代表基于volatile变量的运算在并发下是安全的,因为volatile只能保证内存可见性,却没有保证对变量操作的原子性。比如下面的代码:
  /**
  *发起20个线程,每个线程对race变量进行10000次自增操作,如果代码能够正确并发,
  *则终race的结果应为200000,但实际的运行结果却小于200000。
  *
  *@author Colin Wang
  *
  */
  public class VolatileTest{
  public static volatile int race=0;
  public static void increase(){
  race++;
  }
  private static final int THREADS_COUNT=20;
  public static void main(String[]args){
  Thread[]threads=new Thread[THREADS_COUNT];
  for(int i=0;i<THREADS_COUNT;i++){
  threads[i]=new Thread(new Runnable(){
  @Override
  public void run(){
  for(int i=0;i<10000;i++){
  increase();
  }
  }
  });
  threads[i].start();
  }
  while(Thread.activeCount()>1)
  Thread.yield();
  System.out.println(race);
  }
  }