多线程与高并发(四)volatile关键字

上一篇学习了synchronized的关键字,synchronized是阻塞式同步,在线程竞争激烈的情况下会升级为重量级锁,而volatile是一个轻量级的同步机制。

前面学习了Java的内存模型,知道各个线程会将共享变量从主内存中拷贝到工作内存,然后执行引擎会基于工作内存中的数据进行操作处理。一个CPU中的线程读取主存数据到CPU缓存,然后对共享对象做了更改,但CPU缓存中的更改后的对象还没有flush到主存,此时线程对共享对象的更改对其它CPU中的线程是不可见的。

而volatile修饰的变量给java虚拟机特殊的约定,线程对volatile变量的修改会立刻被其他线程所感知,即不会出现数据脏读的现象,从而保证数据的“可见性”。

我们可以先简单的理解:被volatile修饰的变量能够保证每个线程能够获取该变量的最新值,从而避免出现数据脏读的现象。

一、三个特性

在分析volatile之前,我们先看下多线程的三个特性:原子性,有序性和可见性

1.1 原子性

原子性是指一个操作是不可中断的,要么全部执行成功要么全部执行失败。即多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程所干扰。

看下面几行代码:

int a = 10; //语句1 a++; //语句2 int b=a; //语句3 a = a+1; //语句4

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwzzjz.html