并发编程面试题之 volatile 关键字

并发编程面试文章地址链接

内容 博客链接
并发编程面试题之常见面试题 https://blog.csdn.net/weixin_38251871/article/details/104658674
并发编程面试题之 volatile 关键字 https://blog.csdn.net/weixin_38251871/article/details/104667384
并发编程面试题之 CAS https://blog.csdn.net/weixin_38251871/article/details/104667406
并发编程面试题之锁 https://blog.csdn.net/weixin_38251871/article/details/104667392
并发编程面试题之阻塞队列 待完成…
并发编程面试题之 AQS 待完成…
并发编程面试题之线程池 待完成…
并发编程面试题之 synchronizedReentrantLock 的区别 https://blog.csdn.net/weixin_38251871/article/details/104667532
并发编程面试题之 CyclicBarrier、CountDownLatch、Semaphore 待完成…
并发编程面试题之 ConcurrentHashMap https://blog.csdn.net/weixin_38251871/article/details/104667433
并发编程面试题之 synchronized 实现原理 https://blog.csdn.net/weixin_38251871/article/details/104667415

  • 变量可见性: 保证了该变量对所有的线程是可见的。【例:线程 one 修改了变量的值,那么其他线程都可以获取到最新值】

  • 禁止指令重排序

  • Java 语言提供的一种稍弱的同步机制, volatile 关键字 用于确保将变量的更新操作通知给其他的线程;volatile 具备两种特性,它不会被缓存在寄存器【CPU 缓存】,所以在读取 volatile 关键字修饰的变量时总是会从主内存中返回最新值。

  • 对非 volatile 关键字修饰的变量进行读写操作的时候,每个线程先从主内存拷贝变量的值到 CPU cache 中,假如有多个 CPU,每个线程可能在不同的 CPU 上处理,这意味着每个线程可以拷贝到不同的 CPU 缓存。

  • 使用 volatile 关键字修饰的变量, JVM 跳过了 CPU 缓存,保证了每次读写都是对主内存进行操作。

  • volatile 关键字修饰的变量的单次 read/write 操作是可以保证原子性的,比如 long/double/boolean 类型的变量,因为 long/double/boolean 都是 64 位,对于这两种数据类型的读是分为两个部分,第一次读取的是 32 位,然后再读取剩下的 32 位,在这个过程中不是原子操作。但 JVM 中的 volatile 关键字修饰的 long/double/boolean 后, 其读写就是原子操作。但是对于 自增/自减 并不能保证原子性,因为它们本质上是读和写两次操作。

发布了17 篇原创文章 · 获赞 3 · 访问量 541

猜你喜欢

转载自blog.csdn.net/weixin_38251871/article/details/104667384