java volatile关键字用法

来源:互联网 发布:ubuntu vbox 编辑:程序博客网 时间:2024/05/16 06:24

总结了下

特点:

1、具有锁的“可见性”,但不具有锁的“互斥性”。即可以保证释放锁之前对共享数据所做的修改对于随后的锁是可见的,即保证了数据的一致性,但不能保证同一时刻只有一个线程这个变量进行访问,即不具有原子性,不能保证变量在操作期间的值保持不变,因此,通常情况下,不能像 synchronized 那样普遍适用于实现线程安全

2、volatile的性能优于synchronized。

使用场景:只有在状态真正独立于程序内其它内容时才能使用volatile,否则容易造成数据不一致的问题。

比如,如下例子不适合使用volatile定义lower和upper,原因是初始值是(0,5),当线程A和B分别同时调用setLower(4)和setUpper(3)时,导致了(4,3)这样的错误结果。    

@NotThreadSafe public class NumberRange {    private int lower, upper;    public int getLower() { return lower; }    public int getUpper() { return upper; }    public void setLower(int value) {         if (value > upper)             throw new IllegalArgumentException(...);        lower = value;    }    public void setUpper(int value) {         if (value < lower)             throw new IllegalArgumentException(...);        upper = value;    }}
因此,volatile只能用于一组非常有限的用例:a、对变量的写操作不依赖于当前值;b、该变量没有包含在具有其它变量的不变式中,比如:  
volatile boolean shutdownRequested;...public void shutdown() { shutdownRequested = true; }public void doWork() {     while (!shutdownRequested) {         // do stuff    }}
可以在另一个线程中控制shutdownRequested,使得程序停止,此处非常适合使用volatile,通过同步确保参数的一致性。

0 0
原创粉丝点击