volatile

最近打算继续写博客了,还是最初的想法,一边可以作为笔记和自己灵感迸发的一个记录,另一边希望能够帮助到其他人解决疑惑。

之前也曾提到过,Java 内存模型都是围绕着原子性、有序性和可见性展开的,既然如此,那么Java 又可以选择怎样做来保证这些呢?事实上,Java 使用了一些特殊的操作或者关键字来申明、告诉虚拟机,在这个地方,要尤其注意,不能随意变动优化目标指令。关键字 volatile 就是其中之一。

当你使用了一个volatile去声明一个变量时,就等于告诉虚拟机,这个变量极有可能某些程序或者线程修改。虚拟机就会采用一些特殊手段,保证这个变量的可见性等特点。

比如,根据编译器的优化规则,如果不使用volatile 申明变量,那么这个变量被修改后,其他线程可能并不会被通知到,但一旦使用 volatile,虚拟机就会特别小心处理这种情况。
事实上,volatile 并没有它看上去那么强大,在处理原子性的操作时,它有很大的帮助,但对于一些复合操作的原子性,它无法保证。诚然,它并不能代替锁。比如常用的例子,多个线程对同一个变量实现自增操作。

public class VolatileTest{

    public static volatile int i ;
    
    public static  void main(String[] args) throws Exception{
        for(int i=0;i<50;i++){
            new Task().start();
        }
	System.in.read();
        System.out.println("i: "+i);
	
    }
}
class Task extends Thread{
        public void run(){
	    try{
		Thread.sleep(2000);
		}catch(InterruptedException e){
		}
	    
            VolatileTest.i++;
        }
}

这段代码可以做个大概的测试,结果会小于50。这是因为线程间执行自增时可能使用了“旧的数据”。

–来自 Java 高并发程序设计(葛一鸣 郭超) 的读书笔记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值