新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
创新互联www.cdcxhl.cn八线动态BGP香港云服务器提供商,新人活动买多久送多久,划算不套路!
昭苏ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:028-86922220(备注:SSL证书合作)期待与您的合作!这篇文章主要介绍java中JUC原子类基本类型是什么,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
我们先来看一下基本类型: AtomicInteger, AtomicLong, AtomicBoolean。AtomicInteger和AtomicLong的使用方法差不多,AtomicBoolean因为比较简单所以方法比前两个都少,那我们这节主要挑AtomicLong来说,会使用一个,其余的大同小异。
1.原子操作与一般操作异同
我们在说原子操作之前为了有个对比为什么需要这些原子类而不是普通的基本数据类型就能满足我们的使用要求,那就不得不提原子操作不同的地方。
当你在操作一个普通变量时,你在Java实现的每个操作,在程序编译时会被转换成几个机器能读懂的指令。例如,当你分配一个值给变量,在Java你只使用了一个指令,但是当你编译这个程序时,这个指令就被转换成多个JVM 语言指令。这样子的话当你在操作多个线程且共享一个变量时,就会导致数据不一致的错误。
为了避免这样的问题,Java引入了原子变量。当一个线程正在操作一个原子变量时,即使其他线程也想要操作这个变量,类的实现中含有一个检查那步骤操作是否完成的机制。 基本上,操作获取变量的值,改变本地变量值,然后尝试以新值代替旧值。如果旧值还是一样,那么就改变它。如果不一样,方法再次开始操作。这个操作称为 Compare and Set(简称CAS,比较并交换的意思)。
原子变量不使用任何锁或者其他同步机制来保护它们的值的访问。他们的全部操作都是基于CAS操作。它保证几个线程可以同时操作一个原子对象也不会出现数据不一致的错误,并且它的性能比使用受同步机制保护的正常变量要好。
2.AtomicLong简介
由字面意义我们可以知道AtomicLong可以用原子方式更新的 long 值,下面我们看一下他的构造方法和一般方法:
构造方法:
AtomicLong() //创建具有初始值 0 的新 AtomicLong。
AtomicLong(long initialValue) //创建具有给定初始值的新 AtomicLong。方法:
long addAndGet(long delta) //以原子方式将给定值添加到当前值。
boolean compareAndSet(long expect, long update) //如果当前值 == 预期值,则以原子方式将该值 设置为给定的更新值。
long decrementAndGet() //以原子方式将当前值减 1。
double doubleValue() //以 double 形式返回指定的数值。
float floatValue() //以 float 形式返回指定的数值。
long get() //获取当前值。
long getAndAdd(long delta) //以原子方式将给定值添加到当前值。
long getAndDecrement() //以原子方式将当前值减 1。
long getAndIncrement() //以原子方式将当前值加 1。
long getAndSet(long newValue)// 以原子方式设置为给定值,并返回旧值。
long incrementAndGet() //以原子方式将当前值加 1。
int intValue() // 以 int 形式返回指定的数值。
void lazySet(long newValue) //最后设置为给定值。
long longValue() // 以 long 形式返回指定的数值。
void set(long newValue) //设置为给定值。
String toString() // 返回当前值的字符串表示形式。
boolean weakCompareAndSet(long expect, long update) //如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。
3.使用AtomicLong
3.1 创建AtomicLong
创建AtomicLong的过程如下:
AtomicLong atomicLong = new AtomicLong();