首页 > 编程知识 正文

java atomicinteger,atomic基本数据类型

时间:2023-05-06 07:11:29 阅读:24908 作者:2759

目录

1、原子长的基本使用方法

2、自动龙刀

2.1、JVM源代码分析

2.2、自动长码部分

3、总结

1、AtomicLong的基本用法与AtomicInteger非常相似,AtomicLong提供了一个对long类型数据进行原子操作的解决方案,AtomicLong提供的原子方法在使用习惯上也与AtomicInteger非常相似我们不详细说明每种方法是如何使用的,请参阅《AtomicInteger》。 AtomicInteger类最重要的方法是compareAndSwapInt,同样,AtomicLong类也提供了类似的方法compareAndSwapLong,但此方法是compareandswaping

2、AtomicLong内幕2.1、JVM源代码分析表明,long类型可能占用8字节64位,部分机器硬件不支持8字节64位的cmpxchg CPU指令。 在此情况下,需要确定当前JVM版本是否支持8字节数字cmpxchg操作; 如果机器硬件和当前JVM版本都不支持,则实际上对长数据的原子操作必须在加锁上确保原子性,而不是Lock Free。 请看hotspot JVM的AtomicLong的源代码。 具体路径为srcsharevmprimsunsafe.cpp

//CompareAndSwapLong方法unsafe_entry(jboolean,unsafe _ compareandswaplong (JNI env * env,jobject unsafe,jobject oblong jong*addr=(jlong* ) index _ OOP _ from _ field _ offset _ long (p ),offset ); # ifdef supports _ native _ cx8//判断CPU是否支持8字节操作return(jlong ) (atomic33603360cmpxchg ) x,addr,e ) ) #确定else if (VM _ version :3360 supports _ cx8 () )//JVM是否支持8字节操作return(jlong ) (atomic 3360: cmpxx8 ) //不支持执行封锁操作的mutexlockerexmu (unsafe jlong _ lock,mutex 33603360 _ no _ safe point _ check _ flag ); Jong val=atomic :3360 load (addr ); if(val==e )原子IC :3360存储(x,addr ); success=true; }返回成功; } #让我们看看}#endifUNSAFE_END 2.2,AtomicLong的部分源代码。 查看AtomicLong的部分源代码,可以看到AtomicLong中VM_SUPPORTS_LONG_CAS的定义,其作用与supports_nas相同

/* * recordswhethertheunderlyingjvmsupportslockless * compareandswapforlongs.whiletheunsafe.compareandswaplong * method worongs someconstructionsshouldbe * handledatjavaleveltoavoidlockinguser-visible locks.*/staticfinalbooks/* * returnswhetherunderlyingjvmsupportslocklesscompareandset * for longs.calledonlyonceandcachedinvm _ supports _ long 3,atimion 与AtomicInteger相同,但编译器编译为字节码时,确定当前JVM或计算机硬件是否支持8字节CAS操作,如果支持,则执行Free Lock操作,否则为http://www

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。