江湖开发者 | Java粉
网站地图
首页> 大数据> java volatile变量
2016
07-22

java volatile变量

java volatile变量


volatile变量对于所有线程是可见的,不存在副本,正确使用volatile变量的方式包括:用于确保它们所引用的对象状态的可见性,或者用于标识重要的生命周期事件(比如初始化或关闭)的发生。


votatile对可见性的影响所产生的价值远远高于变量本身。


一种同步的弱形式:volatile变量。它确保对一个变量的更新以可预见的方式告知其他的线程。当一个域声明为volatile类型后,编译器与运行时会监视这个变量:它是共享的,而且对它的操作不会与其他的内存操作一起被重排序。 volatice变量不会缓存在寄存器或者缓存在对其他处理器隐藏的地方。所以,读一个volatile类型的变量时,总会返回由某一个线程所写入的最新值。


对于当今大多数处理器架构而言,读取volatile变量的开销只比读取非volatile变量的开销略高。


eg:

public class PrimeGenerator implements Runnable{
	
	private final List<BigInteger> primes = new ArrayList<BigInteger>();
	
	private volatile boolean cancelled;
	
	@Override
	public void run() {
		BigInteger p = BigInteger.ONE;
		while(!cancelled){
			p = p.nextProbablePrime();
			synchronized(this){
				primes.add(p);
			}
		}
	}
	
	public void cancel(){
		cancelled = true;
	}
	
	public synchronized List<BigInteger> get(){
		return new ArrayList<BigInteger>(primes);
	}
	
	//生成素数的程序运行一100ms
	public static void main(String[] args) throws InterruptedException {
		
		PrimeGenerator generator = new PrimeGenerator();
		
		new Thread(generator).start();
		
		try{
			Thread.sleep(100);
		}finally{
			generator.cancel();
		}
		
		List<BigInteger> list = generator.get();
		
		for(BigInteger p:list){
			System.out.println(p);
		}
	}

}





Java江湖     
全部评论:

表情验证码,看不清楚,换一张

随机文章

云标签

公众号

微信

分享:分享我们的知识;专注:专注个人技术的提升;