码迷,mamicode.com
首页 > 其他好文 > 详细

Atomic原子类

时间:2019-05-02 23:28:50      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:获取   子类   原来   value   atomic   自己   更新   offset   add   

原子类实现原理: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原子类

标签:获取   子类   原来   value   atomic   自己   更新   offset   add   

原文地址:https://www.cnblogs.com/zhz-8919/p/10803564.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!