Atomic原子类
Posted zhz-8919
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Atomic原子类相关的知识,希望对你有一定的参考价值。
原子类实现原理:CAS(compare and swap)
- CAS的原理是拿期望的值和原本的一个值作比较,如果相同则更新成新的值。UnSafe 类的 objectFieldOffset() 方法是一个本地方法,这个方法是用来拿到“原来的值”的内存地址。另外 value 是一个volatile变量,在内存中可见,因此 JVM 可以保证任何时刻任何线程总能拿到该变量的最新值。
- CAS包含3个参数CAS(V,E,N).V表示要更新的变量, E表示预期值, N表示新值.仅当V值等于E值时, 才会将V的值设为N, 如果V值和E值不同, 则说明已经有其他线程做了更新, 则当前线程什么都不做. 最后, CAS返回当前V的真实值. CAS操作是抱着乐观的态度进行的, 它总是认为自己可以成功完成操作.当多个线程同时使用CAS操作一个变量时, 只有一个会胜出, 并成功更新, 其余均会失败.失败的线程不会被挂起,仅是被告知失败, 并且允许再次尝试, 当然也允许失败的线程放弃操作.基于这样的原理, CAS操作即时没有锁,也可以发现其他线程对当前线程的干扰, 并进行恰当的处理.
- 当线程较少时,CAS的效率很高,但是当竞争激烈时,会造成大量的线程自旋
Atomic基本数据类型
- AtomicInteger
- AtomicLong
- AtomicBoolean
Atomic基本类型原子类常用方法
- int get() // 获取当前值
- int getAndSet(int value) // 获取当前值并设置成指定值等价于普通变量的i = value
- int getAndIncrement() // 自增 ,等价于普通变量的i++
- int getAndDecrement() // 自减,等价于普通变量的i--
- int getAndAdd(int Value) // 加上预期值,等价于普通变量的i = i + value
- boolean compareAndSet(int expect, int update)
以上是关于Atomic原子类的主要内容,如果未能解决你的问题,请参考以下文章