volatile关键字是什么?

volatile关键字是什么

主要从以下三点讲解 volatile 关键字:volatile 关键字是什么?volatile 关键字能解决什么问题?使用场景是什么?volatile 关键字实现的原理?volatile 关键字是什么?在 Sun 的 JDK 官方文档是这样形容 volatile 的:The Java programming language provides a second mechanism, volatile fields, that is more convenient than locking for some purposes. A field may be declared volatile, in which case the Java Memory Model ensures that all threads see a consistent value for the variable.也就是说,如果一个变量加了 volatile 关键字,就会告诉编译器和 JVM 的内存模型:这个变量是对所有线程共享的、可见的,每次 JVM 都会读取最新写入的值并使其最新值在所有 CPU 可见。

volatile 可以保证线程的可见性并且提供了一定的有序性,但是无法保证原子性。在 JVM 底层 volatile 是采用内存屏障来实现的。通过这段话,我们可以知道 volatile 有两个特性:保证可见性、不保证原子性禁止指令重排序原子性和可见性原子性是指一个操作或多个操作要么全部执行并且执行的过程不会被任何因素打断,要么都不执行。

性质和数据库中事务一样,一组操作要么都成功,要么都失败。看下面几个简单例子来理解原子性:i == 0; //1j = i; //2i ; //3i = j 1; //4在看答案之前,可以先思考一下上面四个操作,哪些是原子操作?哪些是非原子操作?答案揭晓:1——是:在Java中,对基本数据类型的变量赋值操作都是原子性操作(Java 有八大基本数据类型,分别是byte,short,int,long,char,float,double,boolean)2——不是:包含两个动作:读取 i 值,将 i 值赋值给 j3——不是:包含了三个动作:读取 i 值,i 1,将 i 1 结果赋值给 i4——不是:包含了三个动作:读取 j 值,j 1,将 j 1 结果赋值给 i也就是说,只有简单的读取、赋值(而且必须是将数字赋值给某个变量,变量之间的相互赋值不是原子操作)才是原子操作。

注:由于以前的操作系统是 32 位, 64 位数据(long 型,double 型)在 Java 中是 8 个字节表示,一共占用 64 位,因此需要分成两次操作采用完成一个变量的赋值或者读取操作。随着 64 位操作系统越来越普及,在 64 位的 HotSpot JVM 实现中,对64 位数据(long 型,double 型)做原子性处理(由于 JVM 规范没有明确规定,不排除别的 JVM 实现还是按照 32 位的方式处理)。

在单线程环境中我们可以认为上述步骤都是原子性操作,但是在多线程环境下,Java 只保证了上述基本数据类型的赋值操作是原子性的,其他操作都有可能在运算过程中出现错误。为此在多线程环境下为了保证一些操作的原子性引入了锁和 synchronized 等关键字。上面说到 volatile 关键字保证了变量的可见性,不保证原子性。

 2/3   首页 上一页 1 2 3 下一页 尾页

文章TAG:关键字  查重  摘要  论文  什么是论文摘要和关键字  关键字查重是什么  
下一篇