1.看图自己体会
2.体会不了就给你个小程序
package cs.util; public class VolatileDemo { private volatile int count =0; public int getCount() { return this.count; } public void setCount() { try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } this.count++; } public static void main(String[] args) { // TODO Auto-generated method stub VolatileDemo demo=new VolatileDemo(); for (int i = 0; i < 1000; i++) { new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub demo.setCount(); } }).start(); } while(Thread.activeCount()>1) { Thread.yield(); } System.out.println(demo.getCount()); } }
输出的结果是
不等于1000其实也不怪,这是由于count++其实是有三个操作组成 1.从主存拿共享变量count 2.进行count++ 3.把count写进 内存
本该为7的,最后却为6,少了1,道理知道了吧
3.怎么解决没有出现1000的情况呢 很简单 有几种做法
一.可以加入 synchronized
public void setCount() { try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }
//对count进行原子性操作 synchronized (this) { this.count++; } }
二、使用jdk1.5推出的方法 具体修改如下
//定义一个Lock
private Lock lock=new ReentrantLock(); private volatile int count =0; public int getCount() { return this.count; } public void setCount() { try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } //加锁 lock.lock(); try { this.count++; } finally { //解锁 lock.unlock(); } }
输出结果就都为
赶紧试一试吧
最后总结一下