java并发系列之volatile关键字

package thread;

public class VolatileDemo {

	//用以声明变量的值可能随时会别的线程修改,使用volatile修饰的变量会强制将修改的值立即写入主存
	//volatile不具备原子性(哪些指令是不允许分割的),这是volatile与java中的synchronized、Lock最大的功能差异
	private volatile int a;
	
	public int getA() {
		return a;
	}

	public void setA(int a) {
		this.a = a;
	}

	public void add(){
		
		int x = getA();
		setA(x+1);
		
	}
	
	
	public static void main(String[] args) throws InterruptedException {
		
		final VolatileDemo volatileDemo = new VolatileDemo();
		
		for (int i = 0; i < 10000; i++) {
			new Thread(new Runnable() {
				
				@Override
				public void run() {
					
					volatileDemo.add();
				}
			}).start();
		}
		
		Thread.sleep(10000);
		//此处输出一定不会是10000,因为Volatile不保证原子性
		System.err.println(volatileDemo.getA());
		
	}
	
	
	
}
发布了89 篇原创文章 · 获赞 67 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/xl_1803/article/details/99980685