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();(1) long next = current + 1;(2) if (compareAndSet(current, next))(3) return 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
- java--多线程--原子类变量
- java多线程--原子类
- java 多线程 原子类
- 【Java多线程】原子类
- Java多线程系列--【JUC原子类01】- AtomicLong原子类
- Java多线程系列--【JUC原子类02】- AtomicLongArray原子类
- Java多线程系列--【JUC原子类03】- AtomicReference原子类
- Java多线程系列--【JUC原子类04】- AtomicLongFieldUpdater原子类
- Java多线程(二)之Atomic:原子变量与原子类
- Java多线程(二)之Atomic:原子变量与原子类
- Java多线程(二)之Atomic:原子变量与原子类
- Java多线程(二)之Atomic:原子变量与原子类
- Java多线程(二)之Atomic:原子变量与原子类
- JAVA多线程之JUC原子类
- Java多线程系列--“JUC原子类”
- JAVA CAS 原子类及多线程总结
- java多线程学习之原子类
- 原子类与多线程中变量的累加问题
- android Glide使用详解
- Remote Debugging connecting to a Remote Stub using the Microsoft Debugging Tools for Windows
- Hadoop——Reduce阶段 Values(迭代器)只能遍历一次
- Git初使用!
- 机器视觉霍恩第二章
- java--多线程--原子类变量
- 联考临近,这4个时间点必须关注
- 前端跳槽面试必备技巧
- DirectX.9.0.3D游戏开发总结
- 为了方便读者检索和阅读以往的内容,已开通“号内搜”功能
- UE4 视频播放问题
- Oracle DML SQL题目篇2
- rabbitmq window php环境安装
- Java面试题:高并发环境下,HashMap可能出现的致命问题。注意:是在jdk8以下版本