java并发编程(三)并发模拟工具和线程安全性




AtomicXXX类:

incrementAndGet方法:

unsafe类方法:

示例:2+1=3
var1是当前对象(count),var2是当前count的值(2),var4=1,
var6是底层的值,若无其他线程干扰,var6应该是2。

这句话的含义:对于var(count)对象,若当前值var2和底层值var6相同的话,将var6更新成var6+var4(1);
若当前值和底层的值不相同,则重新从底层获取值,并且当前count对象会指向新的值(3),一直循环,直到底层的值和当前对象的值相同
cas是java底层的方法

---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ----------------------
AtomicLong和LongAdder的区别

引用:https://blog.csdn.net/yao123long/article/details/63683991
LongAdder在AtomicLong的基础上将单点的更新压力分散到各个节点,在低并发的时候通过对base的直接更新可以很好的保障和AtomicLong的性能基本保持一致,而在高并发的时候通过分散提高了性能。
缺点是LongAdder在统计的时候如果有并发更新,可能导致统计的数据有误差。
---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ----------------------
AtomicReference类

AtomicIntegerFieldUpdater类

---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ----------------------
AtomicStampReference解决CAS的ABA问题
CAS ABA 问题 :在CAS操作的时候其他线程将变量的值A改成了B又改回了A,本线程用期望值A比较时发现值没有变,于是CAS就将A值进行了交换操作,这值已经被其他线程改变过,与设计思想是不符合的。
解决思路:每次变量更新的时候,把变量的版本号加一,A改成了B又改回了A的过程,就是A 版本1 B版本2 A版本3,从而解决ABA问题,
这里多了stamp 版本比较,其他的跟其他Atomic类的compareAndSet 方法类似
---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ----------------------
AtomicLongArray维护的是个数组,我们可以选择性的更新某个索引的值,也是进行原子性操作的,相比AtomicLong,会多个索引值让我们更新,

---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ----------------------
如何让某段代码只执行一次








volatil不适用于计数,因为无法保证原子性
适合作为状态标识:


程序次序规则:仅针对有依赖的代码,无依赖代码可乱序执行




浙公网安备 33010602011771号