java并发编程
文章平均质量分 73
日拱一卒ZHD
别害怕梦想与现实的距离;
只有想不到,没有做不到!
展开
-
CAS带来的ABA问题以及解决方案
线程1和线程2同时对变量i = 1 进行操作,线程1对i进行了两次操作,先将i+1 写出,后又进行了i-1并写出,线程2过来读的时候与原来值1仍然是相等的,虽然值仍然相等,但是i的值却发生过改变,期间从1变成2又变成1(ABA问题)。java中使用AtomicMarkableReference或者AtomicStampedReference。AtomicStampedReference: 使用int 记录改变的次数(推荐)!AtomicMarkableReference:使用boolean表示是否修改过。原创 2024-09-04 12:20:13 · 277 阅读 · 0 评论 -
AtomicIntegerArray使用、核心源码解析
cas需要三个参数(绝对地址,期望值,新值),根据绝对地址获取值然后与期望值进行比较,若相等则更新为新值,反之不更新。base = unsafe.arrayBaseOffset(int[].class): 获取数组的首地址;知道数组中每个元素占用的字节,元素占用的字节*元素的下标=元素的偏移地址(相对数组首地址偏移);举例: 假设是int[] 单个元素占用4字节, 第5个元素的首地址应该是(前面有4个元素)其次需要知道数组的首地址(相对地址,相对对象首地址偏移);首先需要直到对象的首地址(绝对地址);原创 2024-09-04 11:34:40 · 991 阅读 · 0 评论 -
AtomicInteger类的API、源码解读
就是获取value属性在对象中的偏移地址。传递this(当前对象)即可获取当前对象的绝对地址,通过当前对象的绝对地址+value的偏移地址即可获得value属性的绝对地址,通过value属性的绝对地址,cpu就可直接操作其值。既然有绝对地址那么就有相对地址,相对地址相对的是段的首地址,也称为偏移地址。上述四个方法支持函数式编程设置值。原创 2024-09-02 12:01:13 · 515 阅读 · 0 评论