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());
		
	}
	
	
	
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章