Java并发编程之原子操作类

Java并发编程之原子操作

原子操作基本类

AtomicInteger

原子更新整型。

//以原子方式将输入的数值与实例中的值(AtomicInteger里的value)相加,并返回结果。
int addAndGet(int delta)
//如果输入的数值等于预期值,则以原子方式将该值设置为输入的值。
boolean compareAndSet(int expect,int update)
//以原子方式将当前值加1,注意,这里返回的是自增前的值。
int getAndIncrement()
//最终会设置成newValue,使用lazySet设置值后,可能导致其他线程在之后的一小段时间内还是可以读到旧的值。
void lazySet(int newValue)
//以原子方式设置为newValue的值,并返回旧值。
int getAndSet(int newValue)

简单事例:

public class AtomicIntegerTest {
​
    static AtomicInteger ai = new AtomicInteger(1);
​
    public static void main(String[] args) {
        //获取并+1
        System.out.println(ai.getAndIncrement());
        System.out.println(ai.get());
    }
​
}

AtomicBoolean

原子更新布尔类型。

boolean compareAndSet(boolean expect, boolean update) 
如果当前值为 ==的预期值,则将该值原子设置为给定的更新值。  
boolean get() 
返回当前值。  
boolean getAndSet(boolean newValue) 
将原子设置为给定值并返回上一个值。  
void lazySet(boolean newValue) 
最终设定为给定值。  
void set(boolean newValue) 
无条件地设置为给定的值。  
boolean weakCompareAndSet(boolean expect, boolean update) 
如果当前值为 ==为预期值,则将该值原子设置为给定的更新值。  

AtomicLong

原子更新长整型。

long addAndGet(long delta) 
将给定的值原子地添加到当前值。  
boolean compareAndSet(long expect, long update) 
如果当前值为 == ,则将原值设置为给定的更新值。  
long decrementAndGet() 
原子减1当前值。  
long get() 
获取当前值。  
long getAndAdd(long delta) 
将给定的值原子地添加到当前值。  
long getAndDecrement() 
原子减1当前值。  
long getAndIncrement() 
原子上增加一个当前值。  
long getAndSet(long newValue) 
将原子设置为给定值并返回旧值。  
long incrementAndGet() 
原子上增加一个当前值。  
int intValue() 
返回此的值 AtomicLong作为 int的基本收缩转换之后。  
void lazySet(long newValue) 
最终设定为给定值。  
long longValue() 
将 AtomicLong的值作为 long 。  
void set(long newValue) 
设置为给定值。  
boolean weakCompareAndSet(long expect, long update) 
如果当前值为 == ,则将原值设置为给定的更新值。
  

原子数组操作

AtomicIntegerArray

原子更新整型数组里的元素,AtomicIntegerArray类主要是提供原子的方式更新数组里的整型

//以原子方式将输入值与数组中索引i的元素相加。
int addAndGet(int i,int delta)
//如果当前值等于预期值,则以原子方式将数组位置i的元素设置成update值。
boolean compareAndSet(int i,int expect,int update)

AtomicLongArray

原子更新长整型数组里的元素。

AtomicReferenceArray

原子更新引用类型数组里的元素。

原子引用操作

AtomicReference

原子更新引用类型。

AtomicReferenceFieldUpdater

原子更新引用类型里的字段。

AtomicMarkableReference

原子更新带有标记位的引用类型。可以原子更新一个布尔类型的标记位和引用类型.构造方法是AtomicMarkableReference(V initialRef,boolean initialMark)。

例1:

public static AtomicReference<User> atomicUserRef = new AtomicReference<User>();
public static void main(String[] args) {
    User updateUser= new User("conan", 15);
    User user=atomicUserRef.get();
    atomicUserRef.compareAndSet(user, updateUser);
}

例2:

private static AtomicIntegerFieldUpdater<User> a = AtomicIntegerFieldUpdater.newUpdater(User.class, "old");
public static void main(String[] args) {
    User conan = new User("conan", 10);
    System.out.println(getAndIncrement(conan));
    System.out.println(a.get(conan));
}

例3:

private static AtomicMarkableReference<Integer> a=new AtomicMarkableReference<Integer>(1, false);
public static void main(String[] args) {
    System.out.println(a.compareAndSet(1, 2, false, true));
}

原子更新字段类

AtomicIntegerFieldUpdater

原子更新整型的字段的更新器。

例子:

public class AtomicIntegerFieldUpdaterTest {
​
    private static AtomicIntegerFieldUpdater<User> a = AtomicIntegerFieldUpdater.newUpdater(User.class, "old");
​
    public static void main(String[] args) {
        User conan = new User("conan", 10);
        System.out.println(a.getAndIncrement(conan));
        System.out.println(a.get(conan));
    }
​
    public static class User {
        private String      name;
        public volatile int old;
​
        public User(String name, int old) {
            this.name = name;
            this.old = old;
        }
​
        public String getName() {
            return name;
        }
​
        public int getOld() {
            return old;
        }
    }
}

AtomicLongFieldUpdater

原子更新长整型字段的更新器。

一种基于反射的实用程序,可以对指定类的指定的volatile long字段进行原子更新。 该类设计用于原子数据结构,其中同一节点的多个字段独立受原子更新的影响。

long accumulateAndGet(T obj, long x, LongBinaryOperator accumulatorFunction) 
原子更新由此更新程序管理的给定对象的字段,并将给定函数应用于当前值和给定值,返回更新后的值。  
long addAndGet(T obj, long delta) 
将给定值原子地添加到由此更新程序管理的给定对象的字段的当前值。  
abstract boolean compareAndSet(T obj, long expect, long update) 
如果当前值为 ==的预期值,则将由此更新程序管理的给定对象的字段原子设置为给定的更新值。  
long decrementAndGet(T obj) 
由此更新程序管理的给定对象的字段的当前值原子减1。  
abstract long get(T obj) 
获取由此更新程序管理的给定对象的字段中保留的当前值。  
long getAndAccumulate(T obj, long x, LongBinaryOperator accumulatorFunction) 
原子更新由此更新程序管理的给定对象的字段,并将给定函数应用于当前值和给定值,返回上一个值。  
long getAndAdd(T obj, long delta) 
将给定值原子地添加到由此更新程序管理的给定对象的字段的当前值。  
long getAndDecrement(T obj) 
由此更新程序管理的给定对象的字段的当前值原子减1。  
long getAndIncrement(T obj) 
由此更新程序管理的给定对象的字段的当前值以原子方式递增1。  
long getAndSet(T obj, long newValue) 
将由此更新程序管理的给定对象的字段原子设置为给定值,并返回旧值。  
long getAndUpdate(T obj, LongUnaryOperator updateFunction) 
使用应用给定函数的结果原子更新由此更新程序管理的给定对象的字段,返回上一个值。  
long incrementAndGet(T obj) 
由此更新程序管理的给定对象的字段的当前值以原子方式递增1。  
abstract void lazySet(T obj, long newValue) 
最终将由此更新程序管理的给定对象的字段设置为给定的更新值。  
static <U> AtomicLongFieldUpdater<U> newUpdater(类<U> tclass, String fieldName) 

AtomicStampedReference

原子更新带有版本号的引用类型。该类将整数值与引用关联起来,可用于原子的更新数据和数据的版本号,可以解决使用CAS进行原子更新时可能出现的ABA问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值