volatile关键字

Java支持多个线程同时访问一个对象或者对象的成员变量,由于每个线程可以拥有这个变量的拷贝(虽然对象以及成员变量分配的内存是在共享内存中的,但是每个执行的线程还是可以拥有一份拷贝,这样做的目的是加速程序的执行,这是现代多核处理器的一个显著特性),所以程序在执行过程中,一个线程看到的变量并不一定是最新的。

关键字volatile可以用来修饰字段(成员变量),就是告知程序任何对该变量的访问均需要从共享内存中获取,而对它的改变必须同步刷新回共享内存,它能保证所有线程对变量访问的可见性。

 

volatile的特性

class VolatileFeaturesExample {
    volatile long vl = 0L;                       //使用volatile声明64位的long型变量
    public void set(long l) {
        vl = l;                                  //单个volatile变量的写
    }
    public void getAndIncrement () {
        vl++;                                    //复合(多个)volatile变量的读/写
    }
    public long get() {
        return vl;                               //单个volatile变量的读
    }
}

假设有多个线程分别调用上面程序的3个方法,这个程序在语义上和下面程序等价。

class VolatileFeaturesExample {
    long vl = 0L;                                //64位的long型普通变量
    public synchronized void set(long l) {       //对单个的普通变量的写用同一个锁同步
        vl = l;
    }
    public void getAndIncrement () {             //普通方法调用
        long temp = get();                       //调用已同步的读方法
        temp += 1L;                              //普通写操作
        set(temp);                               //调用已同步的写方法
    }
    public synchronized long get() {             //对单个的普通变量的读用同一个锁同步
            return vl;
    }
}    

 

volatile变量自身具有下列特性。

❑ 可见性。对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入。

❑ 原子性:对任意单个volatile变量的读/写具有原子性,但类似于volatile++这种复合操作不具有原子性。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

参考: Java并发编程的艺术 4.3.1 volatile和synchronized关键字

上一篇:MySQL MHA架构


下一篇:通过 MHA 0.58 搭建一个数据库集群结构