Counter Code public class Counter { // 声明可见性变量 private static volatile int count = 0;
// 自增方法 public int incr() { return (++count); } //setter 和 getter方法 }CounterThread Code
public class CounterThread implements Runnable { private Counter counter; public CounterThread(Counter counter) { this.counter = counter; } @Override public void run() { for (int i = 0; i < 1000; i++) { counter.incr(); } } }MainApp
public class MainApp { public static void main(String[] args) { Counter counter = new Counter(); CounterThread counterThread = new CounterThread(counter); new Thread(counterThread).start(); new Thread(counterThread).start(); new Thread(counterThread).start(); new Thread(counterThread).start(); try { Thread.sleep(100); System.out.println(counter.getCount()); } catch (InterruptedException e) { e.printStackTrace(); } } } //每次计算出的结果都是小于等于4000,不确定的数。这就证明了volatile并不能保证变量操作是原子性的解决办法 1、使用同步代码块将incr变为同步方法 2、使用锁机制,同步incr内部操作count的代码 3、使用AtomicInteger类型声明变量,然后使用incrementAndGet方法
// 自增方法 public int incr() { synchronized (this)//同步代码块 { return (++count); } }1、作状态标识符
public class Resource { // 标识符(true表示有资源,false表示没有资源) private volatile boolean flag = false; private String name; }2、double check(双重校验)
//即线程安全的单例设计模式 class Singleton{ private volatile static Singleton instance = null; private Singleton() { } public static Singleton getInstance() { if(instance==null) { synchronized (Singleton.class) { if(instance==null) instance = new Singleton(); } } return instance; } }1、深入理解java虚拟机 2、http://www.ibm.com/developerworks/cn/java/j-jtp06197.html
