volatile关键字

阅读更多

简单介绍一下volatile关键字

 

1、Java语言规范对volatile的定义如下:

     volatile关键字为Java虚拟机提供的最轻量级的同步机制。

     Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。

     通俗点讲:就是说一个变量如果用volatile修饰了,则Java可以确保所有线程看到这个变量的值是一致的,如果某个线程对volatile修饰的共享变量进行更新,那么其他线程可以立马看到这个更新,这就是所谓的线程可见性。

2、原子性,可见性,有序性

      JMM围绕着并发过程中如何处理原子性、可见性、有序性这三个特征建立的。

    (1)原子性(Atomicity):

      ①即一个或多个操作要么全部执行不被其他因素打断,要么全部不执行;

      ②JMM直接保证原子性变量的操作包括:read,load,use,assign,store,write;

      ③基本数据类型的变量的读写是具备原子性的(long,double非原子性的协定除外);

      ④volatile 无法保证符合操作的原子性;

   

   (2)可见性(Visibility):

     ①当一个线程修改了共享变量的值,其他线程能够立即得知这个修改;

     ②Java提供了volatile来保证可见性;

     ③当一个变量被volatile修饰后,当一个线程修改共享变量后他会立即被更新到主内存中,当其他线程读取共享变量时,它会直接从主内存中读取。当然,synchronize和锁都可以保证可见性;

    

   (3)有序性(ordering):

    ①Java天然有序性总结一句话:如果在本线程内观察,所有操作都是有序的;如果在一个线程观察另外一个线程所有操作都是无序的。前一句指:“线程内表现为串行语义”,后一句指:“指令重排序现象”以及“工作内存与主内存同步延迟”现象;

    ②Java语言提供volatile以及synchronized保证线程之间操作的有序性,volatile关键字本身就包含禁止指令重排序的语义;

    ③synchronized关键字:“一个变量在同一时刻只允许一条线程对其进行lock操作”的规则,规则决定了持有同一个锁的两个或多个同步块只能串行执行;

你可能感兴趣的:(volatile关键字)