多线程volatile关键字

更多多线程相关知识点详见个人主页【多线程相关】专栏

volatile

基本概念

  • volatile是Java提供的一种轻量级的同步机制,只能用于修饰变量

可见性、有序性

  • 在多线程环境下,本身不具备可见性和有序性
  • 不具备可见性是指:线程A对共享变量的修改,对于线程B来说是不可见的
  • 不具备有序性是指:为了优化性能,编译器和处理器可能会对指令进行重排序,使执行顺序与代码顺序不完全相同

如何保证可见性

volatile保证可见性的方案是

  • volatile 会对其修饰的变量的写操作添加Lock前缀指令,将缓存信息写入内存
  • 缓存信息被写入内存后,会导致其他线程存储的内存地址的数据无效
  • 线程在获取变量的值时,会检查自己现在缓存信息是否被修改
  • 如果被修改,就从将自己的缓存信息更新为当前内存信息,然后再获取变量信息

如何保证有序性

  • volatile 会对其修饰的变量添加读写内存屏障,进而实现禁止指令重排序,保证其原有的顺序

原子性

  • 原子性是指:某些操作不可分割,要么全做,要么不做

为何无法保证原子性

  • 被volatile修饰的变量不具有原子性,对于某个符合操作来说(如i++),多个线程同时进行i++,无法保证两个线程的原子性。i++实际上是先取i的值,再i+1,最后把新值写回i,可能线程A获取到i的值后还没有+1就已经阻塞了,此时线程B访问i,获取的还是原值,无法保证变量i的原子性

volatile和synchronized的区别

  • volatile轻量级,开销较小,synchronized重量级,开销较大
  • volatile能保证可见性和有序性,无法保证原子性,synchronized可以保证可见性有序性和原子性
  • volatile不会造成线程的阻塞,synchronized有可能会造成线程的阻塞
  • volatile适用于一个线程写,多个线程读,如状态标志,synchronized适用于临界区,如共享资源的读写
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值