volatile关键字

    在Java中,每一个线程都会有自己*的一块内存空间(工作内存),其中存放着共享内存中被线程使用是变量值的拷贝。当线程执行时,线程先在在自己的工作内存中操作这些变量,在线程执行完毕后再将工作内存中的变量值写回到共享内存中。

    一个线程可以执行的操作有:使用(use),赋值(assign),装载(load),存储(store),锁定(lock),解锁(unlock)。

    主内存可以执行的操作有:读(read),写(write),锁定(lock),解锁(unlock) 每个操作都是原子的。

    volatile的作用就是强制线程到主线程(共享内存)中读取变量,而不是在工作内存中读取,从而实现了多个线程间变量的可见,也就满足线程安全的可见性。

    volatile关键之虽然保证了多个线程间的可见性,但是却不具备同步性(原子性),可以算一个轻量级的synchronized,性能比synchronized强很多(因为不会阻塞),但是,一般volatile用与只针对与多个线程可见的变量操作,并不能代替synchronizes同步功能。

    示例:

volatile关键字

volatile关键字

    创建十个线程,每个线程对volatile类型的int count做1000次count++操作,最终结果不是每一次都为10000.

    总结:volatile只具有可见性,没有原子性,要实现原子性建议使用atmic包中的原子系列对象,支持原子性操作。