为何volatile不能保证原子性操作
2017-04-13 09:21
274 查看
被volatile修饰的变量可以保证该变量的可见性,但并不能保证操作的原子性。
当需要使用被volatile修饰的变量时,线程会从主内存中重新获取该变量的值,但当该线程修改完该变量的值写入主内存的时候,并没有判断主内存内该变量是否已经变化,故可能出现非预期的结果。如主内存内有被volatile修饰变量 a,值为3,某线程使用该变量时,重新从主存内读取该变量的值,为3,然后对其进行+1操作,此时该线程内a变量的副本值为4。但此时该线程的时间片时间到了,等该线程再次获得时间片的时候,主存内a的值已经是另外的值,如5,但是该线程并不知道,该线程继续完成其未完成的工作,将线程内的a副本的值4写入主存,这时,主存内a的值就是4了。这样,之前修改a的值为5的操作就相当于没有发生了,a的值出现了意料之外的结果。
被synchronize修饰的变量则可以保证变量操作的原子性,因为当某线程使用变量a时,其他线程无法使用变量a,只能等该线程对a操作结束,释放a的锁后才能对a进行操作。
当需要使用被volatile修饰的变量时,线程会从主内存中重新获取该变量的值,但当该线程修改完该变量的值写入主内存的时候,并没有判断主内存内该变量是否已经变化,故可能出现非预期的结果。如主内存内有被volatile修饰变量 a,值为3,某线程使用该变量时,重新从主存内读取该变量的值,为3,然后对其进行+1操作,此时该线程内a变量的副本值为4。但此时该线程的时间片时间到了,等该线程再次获得时间片的时候,主存内a的值已经是另外的值,如5,但是该线程并不知道,该线程继续完成其未完成的工作,将线程内的a副本的值4写入主存,这时,主存内a的值就是4了。这样,之前修改a的值为5的操作就相当于没有发生了,a的值出现了意料之外的结果。
被synchronize修饰的变量则可以保证变量操作的原子性,因为当某线程使用变量a时,其他线程无法使用变量a,只能等该线程对a操作结束,释放a的锁后才能对a进行操作。
相关文章推荐
- java中volatile关键字的用法,它不能保证原子性操作
- volatile 不能保证变量的原子性的操作
- 为什么volatile不能保证原子性而Atomic可以?
- 为什么volatile不能保证原子性而Atomic可以?
- 为什么volatile不能保证原子性而Atomic可以?
- volatile不能保证原子性
- Java之多线程内存可见性_2(volatile不能保证原子性)
- Java线程-volatile不能保证原子性
- 为什么volatile不能保证原子性
- 为什么volatile不能保证原子性而Atomic可以?
- 为什么volatile不能保证原子性而Atomic可以
- 为什么volatile不能保证原子性而Atomic可以?
- 在电子商务系统中涉及到的支付的问题,由于支付操作不能在事务中,怎么保证原子性?
- 为什么volatile不能保证原子性而Atomic可以?
- 【转】为什么volatile不能保证原子性而Atomic可以?
- 为什么volatile不能保证原子性而Atomic可以?(r)
- volatile 可以保证可见性,但不能保证原子性
- 为什么volatile不能保证原子性
- 为什么volatile不能保证原子性而Atomic可以
- 为什么volatile不能保证原子性而Atomic可以?