Java 多线程

Java多线程-Volatile关键字

Volatile关键字

Volatile变量

Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性。这就是说线程能够自动发现 volatile 变量的最新值。Volatile 变量可用于提供线程安全,但是只能应用于非常有限的一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束。因此,单独使用 volatile 还不足以实现计数器、互斥锁或任何具有与多个变量相关的不变式(Invariants)的类(例如 “start <=end”)。

用处说明

当前Java内存模型下,线程既能把变量保存在内存,又能保存在主存。可能造成一线程个在主存中修改了变量的值,另一个线程继续使用寄存器中变量的拷贝,造成了数据不一致。

这时使用volatile关键字声明变量 ,告诉JVM这个变量不稳定,每次使用都需要到主存中去读取。一般多uuj任务环境共享变量都应使用volatile关键字。

Volatile修饰的变量每次被线程访问,都强迫从共享内存中重读该变量的值。当变量变化时,强迫线程将变化值回写到共享内存。因此两个线程总能看到变量的同一个值。

Java 语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才将私有拷贝与共享内存中的原始值进行比较。volatile就是提示JVM,对于这个成员变量,不能保存它的私有拷贝,而应直接与共享成员变量交互。

Volatile是一种稍弱的同步机制,访问volatile变量是不会加锁,也不会执行线程阻塞。因此volatile变量是一种比synchronized关键字更轻量级的同步机制。

因此,在两个或更多的线程需要访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中或为常量是,不必加volatile。

由于使用volatile屏蔽掉了JVM中必要的代码优化,所以效率较低,必要时再用。

发表评论

电子邮件地址不会被公开。 必填项已用*标注