标签:更改 读写 对象 reference atomic syn 同步代码块 code enc
假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。如,synchronized
关键字使用。
假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。如,CAS(Compare and Swap 比较并交换)。
CAS 操作中包含三个操作数
原理
当且仅当预期值和内存值相等时才将内存值修改为新值。首先检查某块内存的值是否跟之前读取时的一样,如不一样则表示期间此内存值已经被别的线程更改过,舍弃本次操作;否则说明期间没有其他线程对此内存值操作,可以把新值设置给此块内存。
问题
只能保证一个共享变量的原子操作
JDK提供了AtomicReference
类来保证引用对象之间的原子性,可以把多个变量放在一个对象里来进行CAS操作。
循环时间长、开销大
自旋CAS(不成功,就一直循环执行,直到成功)。
ABA问题
内存值原来是A,后来被一条线程改为B,最后又被改成了A。
解决方法:引入版本号,更新变量同时修改版本号。
标签:更改 读写 对象 reference atomic syn 同步代码块 code enc
原文地址:https://www.cnblogs.com/wscy/p/9415245.html