Dougli-Atomic原子包

Posted PoetryAndTheDistance

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dougli-Atomic原子包相关的知识,希望对你有一定的参考价值。

Dougli->Atomic原子包

1、全面走一遍Atomic包下面的原子类

2、CAS->原子比较与交换算法的bug-ABA

3、魔法类->Unsafe,jni->堆外内存

1、atomic底层实现是基于无锁算法cas

基于魔术类Unsafe提供的三大cas-api完成

compareAndSwapObject
compareAndSwapInt
compareAndSwapLong
基于硬件原语-CMPXCHG实现原子操作cas
AtomicInteger分析
    
do {
    oldvalue = this.getIntVolatile(var1, var2);//读AtomicInteger的value值
    ///valueOffset---value属性在对象内存当中的偏移量
} while(!this.compareAndSwapInt(AtomicInteger, valueOffset, oldvalue, oldvalue + 1));
return var5;

什么叫偏移量?
要用cas修改某个对象属性的值->,首先要知道属性在对象的内存空间的哪个位置,必须知道属性的偏移量
    

如果说要原子修改的属性是一个Array?

提供数组的cas修改

如果不是整形数组?可以改?

CAS修改的ABA问题!

王百万: 打算往自己账户100w,先查一下自w己账户:有多少钱->100W,在柜台查的,撩妹->耽误时间(1小时),

撩妹聊完了,又查了一下自己的户头,100w;

张三:去老王账户100w->非法转入股票市场户口(此时老王账户0)->炒股做T的高手(低买高卖)–>150w->100W又转回老王的户头,张三赚了50w

ABA-》怎么解决?

A-0->B-1->A-2->B-3->A-4

AtomicStampedReference(V initialRef, int initialStamp)

//initialRef要改的初始值,initialStamp-初始版本号
操作线程Thread[主操作线程,5,main]stamp=0,初始值 a = 1
操作线程Thread[干扰线程,5,main]stamp=1,【increment】 ,值 = 2
操作线程Thread[干扰线程,5,main]stamp=2,【decrement】 ,值 = 1
操作线程Thread[主操作线程,5,main]stamp=0,CAS操作结果: false

Unsafe jdk1.7之后,加的api

内存管理:

举个例子:文件上传,并发量也比较高;可以用unsafe申请堆外内存

堆外内存不属于GC管,注意用完一定要手动释放。否则内存泄露

以上是关于Dougli-Atomic原子包的主要内容,如果未能解决你的问题,请参考以下文章

为啥保守光栅化无法为某些三角形调用片段着色器?

C++11多线程 原子操作概念及范例

具有运行时 pojos 的带有 Hibernate 的 OSGi 片段包

Java学习笔记—多线程(原子类,java.util.concurrent.atomic包,转载)

cocurrent包 原子性数据类型

vscode用啥符号把某一段代码包起来,类似C#的#region?