java--多线程--原子类变量

来源:互联网 发布:dba数据工程师 编辑:程序博客网 时间:2024/05/24 07:35

原子变量类

原子变量类可以提供原子性的自增自减操作常用的原子类变量为:AtomicLong,AtomicInteger,AtomicBoolean,AtomicReference.相比使用synchronized的好处在于原子类操作不会导致线程的挂起和重新调度,因为他内部使用的是cas的非阻塞算法

CAS

CAS 即CompareAndSet,也就是比较并设置,CAS有三个操作数分别为:内存位置,旧的预期值,新的值,操作含义是当内存位置的变量值为旧的预期值时候使用新的值替换旧的值。通俗的说就是看内存位置的变量值谁不是我给的旧的预期值,如果是则使用我给的新的值替换他,如果不是我给的旧值,则返回告诉我当前内存位置的值是多少。这个是处理器提供的一个原子性指令。上面介绍的AtomicLong的自增就是使用这种方式实现:
public final long incrementAndGet() {        for (;;) {            long current = get();(1long next = current + 1;(2if (compareAndSet(current, next))(3return next;        }    }    public final boolean compareAndSet(long expect, long update) {        return unsafe.compareAndSwapLong(this, valueOffset, expect, update);    }
假如当前值为1,那么线程A和检查B同时执行到了(3)时候各自的next都是2,current=1,假如线程A先执行了3,那么这个是原子性操作,会把档期值更新为2并且返回1,if判断true所以incrementAndGet返回2.这时候线程B执行3,因为current=1而当前变量实际值为2,所以if判断为false,继续循环,如果没有其他线程去自增变量的话,这次线程B就会更新变量为3然后退出。这里使用了无限循环使用CAS进行轮询检查,虽然一定程度浪费了cpu资源,但是相比锁来说避免的线程上下文切换和调度。
阅读全文
0 0
原创粉丝点击