volatile 关键字:
当多个线程进行操作共享数据时,可以保证内存中的数据可见。
相较于 synchronized 是一种较为轻量级的同步策略。
注意:
1. volatile 不具备“互斥性”:
互斥性:多个线程访问时,只能有一个线程可以拿到锁。
2. volatile 不能保证变量的“原子性”
原子性问题解释
i++ 的原子性问题:i++ 的操作实际上分为三个步骤“读-改-写”
举例:
int i = 10;
i = i++; //10,结果为10
下面是计算机底层的运算
int temp = i;
i = i + 1;
i = temp;
从以上三步可以看出,结果 i=10, 这是计算机底层的运算
因为i++有读改写三步操作,所以volatile关键字在这里解决不了问题,volatile只是保证数据的都在主存中进行,
当多线程进行同时访问的时候,并不保证这三步操作具有一个同步性