大家好,很久没有和大家分享学习知识了,今天大年初一,在这里祝大家新年快乐。
作为新年第一篇博客,我们在这里和大家分享一些关于volatile的学习知识。
首先我们知道volatile被称作是JAVA中的轻量级锁,其实个人理解这种说法并不恰当,只能是说明volatile变量具有锁的某些特性,但是不能简单的理解成锁。下面说一下本人对volatile的理解,首先一点,我并不是将voiatile当成锁来理解,我更加觉得volatile像是JMM(JAVA内存模型)对JAVA程序员的一种承诺,可以这么说,作为一个程序员,当我对我的变量使用的volatile来修饰的时候,那么JMM就保证了这个变量在多线程情况下的数据可见性,对于使用者来说,我并不需要知道,这种可见性是怎么实现的。所以volatile更像是一种承诺,类似于Serializable接口,这个接口并没有实现任何的方法,但是实现这个接口后,JVM就会对数据在数据传输时进行序列化处理,当然,这里仅仅是做类比,两者之间是完全不同的两个东西。
那么说完了个人理解,我们来说一下volatile有什么特性以及是怎么实现的:
特性一:数据可见性
对于一个volatile变量的写,总是对之后对这个变量的读可见。
特性二:操作原子性:
对于对一个volatile变量的单个读或写总是能够保证原子性,但是类似于i++这种操作,不具备操作原子性。
那么这两个特性是怎么实现的呢?
首先我们从编译的角度来说,当对一个volatile变量进行写操作时,编译器进行编译后