Java并发编程volatile关键字

并发编程中的三个概念

  1. 原子性:原子是世界上的最小单位,具有不可分割性。原子性意味着一个线程一次只能执行由一个指定监控对象(lock)保护的代码,从而防止多个线程在更新共享状态时相互冲突。非原子操作都会存在线程安全问题,需要我们使用同步技术(sychronized)来让它变成一个原子操作。
  2. 可见性:是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的,即当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。
  3. 指令重排序:不保证程序中各个语句的执行先后顺序同代码中的顺序一致,但是它会保证程序最终执行结果和代码顺序执行的结果是一致的。指令重排序不会影响单个线程的执行,但是会影响到线程并发执行的正确性。

volatile关键字

     volatile是一种比synchronized关键字较轻量级的同步机制,在访问volatile变量时不会执行加锁操作,也不会造成线程的阻塞,被volatile修饰的成员变量,在各个线程的私有工作内存中不存在它的私有拷贝,各个线程在访问该变量前必须从主存(共享内存)中读取该变量的值。

    volatile修饰的变量不允许线程内部缓存和重排序即直接修改内存。volatile关键字保证了被它修饰的变量值修改后立即同步到主内存,每次使用该变量前都从主内存中刷新,即被volatile修饰的变量对所有的线程是可见的,对volatile变量的所有的写操作都能立即反映到其他线程中。

    volatile关键字只能保证共享变量的可见性,只能保证不同线程每次访问该共享变量时读取的是该变量的最新值,但不能保证对变量的操作的原子性。

     volatile关键字无法保证操作的原子性,通常来说,使用volatile关键字必须具备以下2个条件:
①对变量的写操作不依赖当前值,或者能够确保只有单一的线程修改变量的值。
②该变量没有包含在具有其他变量的不变式中,或者说变量不需要与其它的状态变量共同参与不变约束。
以上条件说明,n++,n--这些非原子操作不能保证volatile关键字修饰的变量在并发条件下值的正确性,而只有n=m+1,n=5,这些原子操作才能保证该变量在并发环境下值的正确性。

引用:https://www.jianshu.com/p/387a04a78c84


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值