Java虚拟机--无锁(十五)
来源:互联网 发布:1683维也纳战役 知乎 编辑:程序博客网 时间:2024/06/04 19:11
- 啥是无锁?
- 高并发时,"锁"的激烈竞争可能会成为系统瓶颈;无锁使用非阻塞同步的方法,在不使用锁的前提下,确保数据和程序在高并发环境下保持多线程间的一致性。
- 理解CAS
- 重申"锁"的同步方式
- 一种阻塞的线程同步方式,不同线程在锁竞争时,总不能避免相互等待,从而阻塞当前线程;
- 如何解决这个问题?
- 那就是非阻塞同步咯。代表是ThreadLocal,每个线程拥有各自独立的变量副本,在并行计算时,无需相互等待;
- CAS算法
- 非阻塞,没有死锁,线程之间影响小,系统开销小,没有线程间调度的开销;
- 算法实现过程:
- 包含三个参数CAS(V,E,N):V:要更新的变量,E:预期值,N:新值;
- 仅当V值等于E值时,才会将V的值设为N,如果V值和E值不同,则说明已经有其他线程做了更新,则当前线程什么都不做;
- 最后,CAS返回当前V的真实值;
- 多个线程同时使用CAS操作一个变量时,只有一个会成功更新,其余均会失败;
- 失败的线程不会被挂起,仅是被告知失败,并且允许再次尝试,也允许它放弃操作;
- 即使没有锁,CAS也可以发现其他线程对当前线程的干扰,并进行处理;
- 原子操作
- java.util.concurrent.atomic包下,有对无锁算法实现的原子操作类;
- 主要有AtomicInteger(整数),AtomicIntegerArray(整数数组),AtomicLong(长整型),AtomicLongArray(长整型数组),AtomicReference(普通对象);
- 实现机制:在一个死循环中,不断尝试修改目标值,直到修改成功。如果竞争不激烈,会提高修改成功的概率,否则相反;失败次数过多,会影响性能;
- LongAddr
- JDK1.8在java.util.concurrent.atomic包中新引入了LongAdder类来提高原子类性能。
- LongAddr的优化思路:将热点数据value分离成多个单元cell,每个cell独自维护内部的值,当前对象的实际值由所有的cell累计合成,就对value进行了有效的分离,提高了并行度
0 0
- Java虚拟机--无锁(十五)
- java无锁
- Java多线程-无锁
- Android虚拟机无键盘
- 无界面启动虚拟机
- 实验十五 SCVMM虚拟机的迁移
- 智能小车十五《安装openwrt虚拟机》
- 十五本JAVA书籍
- Java学习笔记十五
- JAVA学习十五:异常
- Java基础<十五>---> IO
- JAVA学习总结十五
- java无锁算法CAS
- java无锁队列实现
- Java无锁堆栈详解
- xm list虚拟机无状态
- VM虚拟机无摄像头问题解决
- Android虚拟机无键盘问题
- Mybatis之Spring整合Mapper代理
- ABBYY FineReader操作技巧
- oracle/mysql/sql_server对于主键生成策略的代码展示
- 【高并发简单解决方案】redis队列缓存 + mysql 批量入库 + php离线整合
- 设备管理不停刷新,usb不停刷新
- Java虚拟机--无锁(十五)
- 三种菜单控件的兼容性问题处理集锦
- TPC-DS建表sql
- 每日一句:Effort
- Android Studio for mac快捷键
- PHP 的 chunk_split() 函数
- [Android] Android开发优化之——对Bitmap的内存优化
- 实例分析 JavaScript 词法作用域
- LeetCode 561. Array Partition I