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原子类的主要内容,如果未能解决你的问题,请参考以下文章

JAVA私房菜专栏之Atomic原子类总结

java多线程笔记--Atomic原子操作类

Atomic原子类介绍

Java学习笔记—多线程(原子类,java.util.concurrent.atomic包,转载)

Java多线程之Atomic:原子变量与原子类

八:并发编程之Atomic&Unsafe魔法类详解