java并发编程艺术
- cas算法
- 概要
- 刚开始看这本书的时候很经常看到cas算法,个人觉得cas算法在并发编程中也是挺重要的的一部分,cas是比较并交换的意思(compare and swap),campareAndSwap(int expect,int update),函数中有两个值,expect是期望值,update是更新值,用expect值去和对象中的值(假设为current),当current值相等于expect时,修改current值为update,否则,不修改,刚开始了解cas算法的时候,因为没有了解过实际的应用场景,而且使用单线程的思维方式去考虑cas算法的使用场景,十分不理解这个算法有什么用,但是当你考虑多个线程对一个共享变量进行修改时,就能发现它的好处了,举个多线程中通用的例子,100个线程对一个共享变量(初始值为0)做++操作(每个线程做一次++操作),得出结果小于100。当你使用cas算法,每个线程首先获取这个共享变量设为expect,对变量做了加1操作为update,使用cas算法修改共享变量,假设其他线程没有修改过共享变量,此时expect和共享变量值相等,cas算法将共享变量修改为update值,否则不修改共享变量,在重复如上的操作直到修改成功。
- cas算法原理
- cas算法(campare and swap)
- cas算法有三个核心参数
- 主内存中存放的v值,所有的线程共享。
- 线程上次从主内存中读取的v值设为a存放在线程的帧栈,每个线程私有。
- 需要写入内存中并改写v值得b值,也是线程对a值修改后得到的值。
- 在修改v值前,先用v值和a值进行对比,相等(即没有其他的线程修改主内存中的v值),设置v值为b值,否则,不修改。
- cas算法例子
- cas算法可能出现的问题
- aba问题:https://blog.csdn.net/u012813201/article/details/72841801
- 如何避免aba问题,可以通过版本号来解决aba问题
- 概要
- volatile原理
- 将当前处理器缓存行的数据写回到系统内存中
- 这个写回内存的操作会使其他的cpu里的缓存了改内存地址的数据无效(缓存一致性协议)
- 一般而言,为了提高处理器速度,处理器不直接和内存进行通信,而是先将系统内存的数据读到内部缓存后在操作,但是操作完后不知道何时会写回到内存中。而使用volatile修饰的变量进行的写操作会强制的将修改写入到内存中,并且触发缓存一致性协议,每个处理器上的缓存对应的内存地址无效,强制处理器从内存中获取新的数据。
- 重排序
- 锁
- 公平锁与不公平锁
- 重入锁
- 读写锁
- 乐观锁与悲观锁
- 锁的状态,
- 无锁
- 偏向锁
- 轻量级锁
- 重量级锁
- 原子操作类
java并发编程艺术的更多相关文章
- 如何评价《Java 并发编程艺术》这本书?
对于书评这件事情,我其实是不想写的,因为每个人都有自己的一个衡量标准,每个人眼中都有自己的哈姆雷特,是好是坏每个人都褒贬不一.如果对于书中的知识你都掌握了,你只是想把它作为一种知识串联的记忆体的话,那 ...
- 【java并发编程艺术学习】(二)第一章 java并发编程的挑战
章节介绍 主要介绍并发编程时间中可能遇到的问题,以及如何解决. 主要问题 1.上下文切换问题 时间片是cpu分配给每个线程的时间,时间片非常短. cpu通过时间片分配算法来循环执行任务,当前任务执行一 ...
- 【java并发编程艺术学习】(一)初衷、感想与笔记目录
不忘初心,方得始终. 学习java编程这么长时间,自认为在项目功能需求开发中没啥问题,但是之前的几次面试和跟一些勤奋的或者小牛.大牛级别的人的接触中,才发现自己的无知与浅薄. 学习总得有个方向吧,现阶 ...
- 【java并发编程艺术学习】(三)第二章 java并发机制的底层实现原理 学习记录(一) volatile
章节介绍 这一章节主要学习java并发机制的底层实现原理.主要学习volatile.synchronized和原子操作的实现原理.Java中的大部分容器和框架都依赖于此. Java代码 ==经过编译= ...
- Java并发编程艺术读书笔记
1.多线程在CPU切换过程中,由于需要保存线程之前状态和加载新线程状态,成为上下文切换,上下文切换会造成消耗系统内存.所以,可合理控制线程数量. 如何控制: (1)使用ps -ef|grep appn ...
- 【java并发编程艺术学习】(五)第二章 java并发机制的底层实现原理 学习记录(三) 原子操作的实现原理学习
章节介绍 主要包括 术语定义.处理器如何实现原子操作.Java如何实现原子操作: 原子(atomic)本意是 不能再进一步分割的最小粒子,“原子操作” 意为 不可被中断的一个或一系列操作. 术语定义 ...
- 【java并发编程艺术学习】(四)第二章 java并发机制的底层实现原理 学习记录(二) synchronized
章节介绍 本章节主要学习 Java SE 1.6 中为了减少获得锁 和 释放锁 时带来的性能消耗 而引入的偏向锁 和 轻量级锁,以及锁的存储结构 和 升级过程. synchronized实现同步的基础 ...
- Java并发编程总结(一)Syncronized解析
Syncronized解析 作用: )确保线程互斥的访问同步代码 )保证共享变量的修改能够及时可见 )有效解决重排序问题. 用法: )修饰普通方法(锁是当前实例对象) )修饰静态方法(锁是当前对象的C ...
- Java并发编程基础三板斧之Semaphore
引言 最近可以进行个税申报了,还没有申报的同学可以赶紧去试试哦.不过我反正是从上午到下午一直都没有成功的进行申报,一进行申报 就返回"当前访问人数过多,请稍后再试".为什么有些人就 ...
随机推荐
- python的set处理二维数组转一维数组
for splitValue in set(dataset[:, featureIndex].tolist()): 首先set是一个无序,无重复的数据结构,所以很多时候使用它来进行去重:但是set接收 ...
- git初始化本地项目及关联github远程库
一.初始化本地项目 idea中在项目文件夹下执行:git init . 二.在github官网上创建一个库 三.执行如下命令关联远程库: git remote add origin 你创建的git远程 ...
- AIOps指导
AIOps代表运维操作的人工智能(Artificial Intelligence for IT Operations), 是由Gartner定义的新类别,Gartner的报告宣称,到2020年, ...
- 【Python】hasattr() getattr() setattr() 使用方法详解
本文转自 https://www.cnblogs.com/cenyu/p/5713686.html hasattr(object, name)判断一个对象里面是否有name属性或者name方法,返回B ...
- tomcat的 tomcat-user.xml
http://blog.csdn.net/asdeak/article/details/1879284 很多个tomcat因为在缺少 " <role rolename="m ...
- 黄聪:C#使用Application.Restart重启程序出错解决办法
调用 Application.Restart重启程序出错 解决办法,就是给程序的.exe文件,加上下面的设置
- G2 绘制混合图例 demo
G2 绘制混合图例 demo import G2 from '@antv/g2'; import DataSet from '@antv/data-set'; // G2 对数据源格式的要求,仅仅是 ...
- 【转载】robocopy的用法
经常进行文件管理操作的朋友们,不满意于Windows系统内置的复制功能,因为它太龟速了.于是大家就使用FastCopy.TeraCopy之类的软件来加速复制,但是你是否知道Windows 7已经内置快 ...
- Win7系统安装Centos7.0双系统(三)
4.6语言选择 4.7安装信息设置,除以下几项改动其他都可默认. 软件选择(默认最小):带GUI的服务器或GNOME桌面,可根据使用需要选择安装软件. 磁盘分区:Linux默认可分为3个分区,分别是b ...
- C++Primer第五版——习题答案详解(十一)
习题答案目录:https://www.cnblogs.com/Mered1th/p/10485695.html 第12章 动态内存 练习12.1 b1包含4个元素,b2被销毁 练习12.2 #incl ...