打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
volatile 能使得一个非原子操作变成原子操作吗?

  回答

  能,一个典型的例子是在类中有一个 long 类型的成员变量。如果你知道该成员变量会被多个线程访问,如计数器、价格等,你最好是将其设置为 volatile。为什么?因为 Java 中读取 long 类型变量不是原子的,需要分成两步,如果一个线程正在修改该 long 变量的值,另一个线程可能只能看到该值的一半(前 32 位)。但是对一个 volatile 型的 long 或 double 变量的读写是原子。

  原子性

  Java中的原子操作 所谓原子操作,就是不可中断的一个或一系列操作 , 在确认一个操作是原子的情况下,多线程环境里面,我们可以避免仅仅为保护这个操作在外围加上性能昂贵的锁,甚至借助于原子操作,我们可以实现互斥锁。 … 原子性可以应用于除long和double之外的所有基本类型之上的“简单操作”。

  NOTICE

  volatile并不完全具有原子性,对于复合操作其仍存在线程不安全的问题,如

  每次执行结果都可能不一样

  如果需要保证其原子性,保证其线程安全,就是给 incre 方法加锁 lock/synchronized

  Synchronized与volatile区别

  volatile只能修饰变量,synchronized可以修饰变量,方法以及代码块

  volatile在多线程中不会存在阻塞问题,synchronized会存在阻塞问题

  volatile能保证数据的可见性,但不能完全保证数据的原子性,synchronized即保证了数据的可见性也保证了原子性

  volatile解决的是变量在多个线程之间的可见性,而sychroized解决的是多个线程之间访问资源的同步性

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Java高并发9-CAS操作与Unsafe类详解
关于Java锁机制面试官会怎么问,深刻易懂
面试官想到,一个Volatile,敖丙都能吹半小时
Java 关键字 volatile 的理解与正确使用 | 干货分享
Java并发编程:Volatile不能保证数据同步
深入分析volatile的实现原理
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服