AtomicLong是作用是对长整形进行原子操作。
在32位操作系统中,64位的长和双变量由于会被JVM当作两个分离的32位来进行操作,所以不具有原子性。而使用AtomicLong能让漫长的操作保持原子型。
<强> AtomicLong函数列表强>
//构造函数 AtomicLong ()//创建值为initialValue的AtomicLong对象 AtomicLong initialValue(长)//以原子方式设置当前值为newValue。 最后一个空集(长newValue)//获取当前值 最后长get ()//以原子方式将当前值减1,并返回减1后的值。等价于”——num” 最后长decrementAndGet ()//以原子方式将当前值减1,并返回减1前的值。等价于“num——” 最后长getAndDecrement ()//以原子方式将当前值加1,并返回加1后的值。等价于“+ + num” 最后长incrementAndGet ()//以原子方式将当前值加1,并返回加1前的值。等价于“num + +” 最后长getAndIncrement ()//以原子方式将三角洲与当前值相加,并返回相加后的值。 最后长addAndGet(长三角)//以原子方式将三角洲添加到当前值,并返回相加前的值。 最后长getAndAdd(长三角)//如果当前值==预期,则以原子方式将该值设置为更新。成功返回真,否则返回假,并且不修改原值。 最后布尔compareAndSet(长料,更新)//以原子方式设置当前值为newValue,并返回旧值。 最后长getAndSet(长newValue)//返回当前值对应的int值 int intValue ()//获取当前值对应的长值 长longValue ()//以浮动形式返回当前值 浮动floatValue ()//以双形式返回当前值 双doubleValue ()//最后设置为给定值。延时设置变量的值,这个等价于集()方法,但是由于字段是挥发性类型的,因此次字段的修改会比普通字段(非挥发性字段)有稍微的性能延时(尽管可以忽略),所以如果不是想立即读取设置的新值,允许在“后”台修改值,那么此方法就很有用。如果还是难以理解,这里就类似于启动一个后台线程如执行修改新值的任务,原线程就不等待修改结果立即返回(这种解释其实是不正确的,但是可以这么理解)。 最后的空白lazySet(长newValue)//如果当前值==预期值,则以原子方式将该设置为给定的更新值.JSR规范中说:以原子方式读取和有条件地写入变量但不创建任何之前排的序,因此不提供与除weakCompareAndSet目标外任何变量以前或后续读取或写入操作有关的任何保证。大意就是说调用weakCompareAndSet时并不能保证不存在之前的发生(也就是可能存在指令重排序导致此操作失败)。但是从Java源码来看,其实此方法并没有实现JSR规范的要求,最后效果和compareAndSet是等效的,都调用了unsafe.compareAndSwapInt()完成操作。 最后布尔weakCompareAndSet(长料,更新)
<强> AtomicLong的完整源码强>
/* * ORACLE专有/保密。使用许可条款。 * * * * * * * * * * * * * * * * * * * * *//* * * * * * *作者Doug Lea的JCP成员JSR -援助 *专家小组和向公众发布领域,作为解释 * http://creativecommons.org/publicdomain/zero/./*/包java.util.concurrent.atomic; 进口sun.misc.Unsafe;/* * * {@code长}的值可以自动更新。看到 * {@link java . util . concurrent。原子}包装规范 *描述原子变量的属性。一个 * {@code AtomicLong}自动等应用程序中使用 *增加序列号,不能作为替换 *为{@link java.lang.Long}。然而,这类是扩展 * {@code号码}允许统一访问的工具和实用程序 *处理numerically-based类。 * * @since。 * @author Doug Lea */公开课AtomicLong扩展java实现。可序列化的{ 私有静态最终长serialVersionUID=L;//设置使用Unsafe.compareAndSwapLong更新 私有静态最终不安全不安全=Unsafe.getUnsafe (); 私有静态最终长valueOffset;/* * *记录底层JVM是否支持无锁的 * compareAndSwap多头。虽然Unsafe.compareAndSwapLong *方法在这两种情况下,一些建筑 *在Java级别处理避免锁定用户可见锁。 */静态最终布尔VM_SUPPORTS_LONG_CAS=VMSupportsCS ();/* * *返回底层JVM是否支持无锁的CompareAndSet *多头。rel="外部nofollow”祝辞失败spuriously *,不提供订购担保,所以> 公众最终长incrementAndGet () { (,){//获取AtomicLong当前对应的长值 长电流=();//将当前加1 长下=当前+ 1;//通过中科院函数,更新电流的值 如果(compareAndSet(电流、下)) 返回下一个; } }Java并发之AtomicLong原子类_动力节点Java学院整理