volatile保证了可见性和顺序性,比较常见的使用场景是Atomic系列类,根据 volatile 可见性保证获取数据是最新的,再通过CAS+自旋保证了数据更新的原子性。

第二个比较常见的应用场景是数据初始化标识符使用 volatile 修饰符,保证了初始化过程的顺序性。根据 volatile 关键字实现的单例模式也是保证顺序性的一个例子。

还有一个例子是 FutureTask,FutureTask 不是线程安全的,所以每一个 FutureTask 对象是通过 ExecutorService.submit(Callable<T> task) 创建的新对象,既然每一个执行任务都是不同的FutureTask,那么FutureTask的state字段为什么要设置成volatile的呢?是因为在调用isDone()或isCancelled()时可以立即获取state的最新值(可见性保证),从而保证流程的正确性。

作者:林哲民链接:https://www.zhihu.com/question/280092597/answer/412350801来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。