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
引言 最近可以进行个税申报了,还没有申报的同学可以赶紧去试试哦.不过我反正是从上午到下午一直都没有成功的进行申报,一进行申报 就返回"当前访问人数过多,请稍后再试".为什么有些人就 ...
随机推荐
- java volatile
volatile可以保证变量的可见性 当一个变量定义为volatile后,此变量对所有的线程具有可见性.这里的可见性是指当一个线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的. 每次使用v ...
- Spring Cloud(Dalston.SR5)--Zuul 网关-微服务集群
通过 url 映射的方式来实现 zuul 的转发有局限性,比如每增加一个服务就需要配置一条内容,另外后端的服务如果是动态来提供,就不能采用这种方案来配置了.实际上在实现微服务架构时,服务名与服务实例地 ...
- Azure VMSS (3) 修改VM Template并创建VMSS
<Windows Azure Platform 系列文章目录> 在开始本章内容之前,我们需要准备好Azure VM的镜像,具体可以参考:Azure VMSS (2) 对VM执行Genera ...
- Centos6.5部署Sonar6.7.1备注
1.一定要用非root账号登录(自己建立账号),建立Sonar目录并部署,因为使用了Elasticsearch 5.6.3做搜索服务器,而它不允许用root账号启动服务,会报如下错误: Excepti ...
- 查询linux计算机的出口ip
执行以下命令即可: [root@tkafka ~]# curl http://members.3322.org/dyndns/getip 123.103.9.7 碰到的场景: 微信公众号需要配置ip白 ...
- (转)SQLServer查询数据库各种历史记录
原文地址https://www.cnblogs.com/seusoftware/p/4826958.html 在SQL Server数据库中,从登陆开始,然后做了什么操作,以及数据库里发生了什么,大多 ...
- docker 在windows7 、8下的安装
这里说明一下这种安装方式适合win7 win8的系统环境下安装的,当然win10也可以,但是win10有更好的方式 即安装Docker Toolbox,同时还附加安装 Docker Client fo ...
- android 开发 View _12_ 用Canvas 绘制一张图片(博客中演示用Canvas画验证码图片)
package net.yt.yuncare.widgets; import android.graphics.Bitmap; import android.graphics.Canvas; impo ...
- centos7安装mysql客户端
1.判断是否已安装 [root@k8s-master master]# which mysql /usr/bin/which: no mysql in (/usr/local/sbin:/usr/lo ...
- windows from docker 安装部署spring jar包方法
1.安装docker for windows,去官网下载就可以了,按照官网安装 2.把jar和dockerfile放在一个目录下(target 目录下) Dockerfile: FROM java:8 ...