赞
踩
该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点
volatile
关键字在 Java 中主要用于确保多线程环境下的可见性和禁止指令重排序,但它并不能使一个非原子操作变成原子操作。原子操作是指不会被线程调度机制打断的操作,即该操作在多线程环境下是安全的,不会被其他线程干扰。
volatile
只能保证单个变量读写的原子性,对于复合操作(如自增自减操作 i++
或 i--
)或者多个变量的读写操作,它并不能提供原子性保证。这是因为 volatile
不涉及锁机制,而锁机制才是保证复合操作原子性的关键。
例如,考虑一个计数器 count
的自增操作 count++
。这个操作实际上包含三个步骤:读取 count
的当前值,将值加 1,然后将结果写回 count
。在没有同步机制的情况下,如果两个线程几乎同时执行这个自增操作,它们可能会读取到相同的初始值,然后各自加 1 并写回,导致 count
只增加了 1 而不是 2。这就是所谓的竞态条件(race condition)。
即使 count
被声明为 volatile
,这种情况仍然可能发生,因为 volatile
不能保证整个自增操作的原子性。要解决这
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。