java.util.concurrent源码分析(二)atomic包

1、atomic包介绍

原子操作概念:

“原子”代表最小的单位,所以原子操作可以看做最小的执行单位,
即该操作在执行完毕前不会被任何其他任务或事件打断。

Atomic数据类型有四种类型:

  • AomicBoolean
  • AomicInteger
  • AomicLong
  • AomicReferrence:引用,针对Object
  • 以上四种类型对应的数组类型

所有原子操作都是依赖于sun.misc.Unsafe这个类,它是Java的一个安全的开发工具,大部分的底层操作全部封装在JNI中, 阻止开发人员犯很多低级的错误,这个类底层是由C++实现的,利用指针来实现数据操作。

2、关于CAS

Compare And Set的简称。现代主流CPU都支持的一种硬件级别的原子操作, 比较并交换, 操作包含三个操作数:

* 内存地址(V)
* 预期原值(A)
* 新值(B)

如果内存位置的值与预期原值相匹配, 那么处理器会自动将该位置值更新为新值,否则, 处理器不做任何操作.无论哪种情况, 它都会在 CAS 指令之前返回该位置的值.

CAS相比Synchronized,避免了锁的使用,总体性能比Synchronized高很多。

3、基础的4种类型数值

1、value成员都是volatile
读volatile变量时,使缓存失效,强制从内存中读取最新的值。
volatile关键字的作用是:使变量在多个线程间可见(可见性)
2、基本的set/get方法
3、主要方法
* compareAndSet:现值与预期值一样,更新成功,返回true,否则返回false;
* weakCompareAndSet:实现与compareAndSet一样,区别待考究;
* lazySet:不保证值的改变被其他线程立即看到,返回void;
* getAndSet:取当前值, 使用当前值和准备更新的值做CAS,只不过无论更新成功与否都返回原值;
以上方法的实现都是调用unsafe类的方法。
4、对于Long和Integer
getAndIncrement / incrementAndGet:+1
getAndDecrement / decrementAndGet:-1
getAndAdd / addAndGet:+固定值
三组方法都和getAndSet,取当前值,加减之后得到准备更新的值,再做CAS,
/左右的区别在于返回的是当前值还是更新值.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值