Java并发之AtomicLong原子类_动力节点Java学院整理

  

  

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学院整理