下面是一共通过volatile实现原子性的例子:
通过建立100个线程,计算number这个变量最后的结果。
package com.Sychronized; public class VolatileDemo { private volatile int number=0; public int getNumber() { return this.number; } public void increase() { this.number++; } public static void main(String[] args) { // TODO Auto-generated method stub final VolatileDemo volDemo=new VolatileDemo(); for(int i=0;i<100;i++) { new Thread(new Runnable() { @Override public void run() { volDemo.increase(); } }).start(); } //如果还有子线程在运行,主线程就让出CPU资源 //直到所有的子线程都运行完了,主线程再继续往下执行 while(Thread.activeCount()>1) { Thread.yield(); } System.out.println("number:"+volDemo.getNumber()); } }
运行结果:
发现有几种结果:
造成这个结果的原因就是,volatile关键字具有可见性,number++实际上有三步操作,但是不具备原子性。