Java并行程序基础(十二)
2019独角兽企业重金招聘Python工程师标准>>>
- 无锁
对于并发控制而言,锁是一种悲观策略。它总是假设每一次的临界区操作会产生冲突,因此,必须对每次操作都小心翼翼。如果多个线程同时需要访问临界区资源,就宁可牺牲性能让线程进行等待,所以说锁会阻塞线程执行。而无锁是一种悲观策略,它会假设对资源的访问没有冲突。既然没有冲突,自然不需要等待,所以所有的线程都可以在不停顿的状态下继续执行。如果遇到冲突,无锁的策略使用一种叫做比较交换的技术(CAS Compare And Swap)来鉴别线程冲突,一旦检测到冲突,就重试当前操作一直到没有冲突为止。
CAS算法的过程是这样的:它包含三个参数CAS(V,E,N).V表示要更新的变量,E表示预期值,N表示新值。仅当V值等于E值时,才会将V的值设为N,如果V值和E值不同,则说明已经有其他线程做了更新,则当前线程什么都不做。最后,CAS返回当前V的真实值。CAS操作抱着乐观的态度进行的,它总是认为自己可以完成操作。当多个线程同时使用CAS操作一个变量时,只有一个会胜出,并成功更新,其余均会失败。失败的线程不会被挂起,仅是被告知失败,并且允许再次尝试,当然也允许失败的线程放弃操作。基于这样的原理,CAS操作即使没有锁,也可以发现其他线程对当前线程的干扰,并进行恰当的处理。
1.无锁的应用:AtomicInteger
public final int get() //取得当前值
public final void set(int newValue) //设置当前值
public final int getAndSet(int newValue) //设置新值,并返回旧值
public final boolean compareAndSet(int expect, int update) //如果当前值为expect,则设置为u
public final int getAndIncrement() //当前值加1,返回旧值
public final int getAndDecrement() //当前值减1,返回旧值
public final int getAndAdd(int delta) //当前值增加delta,返回旧值
public final int incrementAndGet() //当前值加1,返回新值
public final int decrementAndGet() //当前值减1,返回新值
public final int addAndGet(int delta) //当前值增加delta,返回新值
AtomicInteger中保存了一个核心字段:
private volatile int value;//代表当前的实际取值
private static final long valueOffset; //保存着value字段在AtomicInteger对象中的偏移量
转载于:https://my.oschina.net/projerry/blog/873043
Java并行程序基础(十二)相关推荐
- shadowplay要下载java_Java并发程序设计(二)Java并行程序基础
Java并行程序基础 一.线程的生命周期 其中blocked和waiting的区别: 作者:赵老师 链接:https://www.zhihu.com/question/27654579/answer/ ...
- Java并发程序设计(二)Java并行程序基础
Java并行程序基础 一.线程的生命周期 其中blocked和waiting的区别: 作者:赵老师 链接:https://www.zhihu.com/question/27654579/answer/ ...
- (二)Java并行程序基础
Java并行程序基础 2.1 线程和进程 2.2 初始线程 2.2.1 新建线程 2.2.2 线程中断 2.2.3 等待(wait)和通知(notify) 2.2.4 挂起(suspend)和继续执行 ...
- Java并行程序基础
有关线程 进程是计算机中的程序关于某数据集合上的一次运动活动,是系统进行资源分配的基础单位.进程是线程的容器.程序是指令.数据及其组织形式的描述,进程是程序的实体. 线程的生命周期 线程的所有状态都在 ...
- java负数右移_收入囊中篇---Java程序基础(二)
前言: 本篇是接着上一篇更新的,如果没有阅读上一篇的话,可以查阅或回顾一下. 1.收入囊中篇---Java基础必备知识(一) 2.收入囊中篇---Java程序基础(二) Java程序基础目录 1.Ja ...
- JVM 内部原理(七)— Java 字节码基础之二
JVM 内部原理(七)- Java 字节码基础之二 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者.架构师.CxO 还是智能手机的普通用户,Java ...
- 【JAVA SE】第十二章 流(Stream)、IO流和文件(File)
第十二章 流(Stream).IO和文件(File) 文章目录 第十二章 流(Stream).IO和文件(File) 一.流(Stream) 1.什么是流 2.流的分类 二.IO流 1.字节输入流(I ...
- 201771010101白玛次仁《面向对象程序设计(java)》第十二周实验总结
实验十二 图形程序设计 实验时间 2018-11-14 学习总结: 1.Java的抽象口工具箱( Abstract WindowToolkit, AWT)包含在java.awt包中,它提供了许多用来 ...
- java面向对象程序基础实验_20165115 实验二《Java面向对象程序设计》实验报告
20165115 实验二 面向对象程序设计 这一次的实验,老师按照实验内容的不同将实验分成了五个部分进行.五个部分的侧重难易都有区别,实验报告中的叙述也会有所区别. 第一部分 先上实验结果截图: 这一 ...
最新文章
- JavaScript之Unspecified error或无法设置selected属性。未指明的错误。解决方案
- 【云栖大会】阿里云成为全国首家云等保试点示范平台
- 怎么修改_PDF怎么修改文字?其实修改PDF内容很简单
- putty 中文乱码
- java线程池使用实战,太牛了!
- VM虚拟机中 localhost login_UTM 2.0 虚拟机来了,解决上网和无声音问题
- vscode生成vue模板快捷键_VSCode一键生成.vue模版
- 小学认识计算机说课ppt,“认识计算机”说课稿.ppt
- 创业有感-表达能力很关键
- 创建微服务架构的步骤_如何快速搭建一个微服务架构?
- 消息队列-简单介绍Java消息队列,什么是消息队列,作用以及常见消息队列
- 时间序列数据的白噪声检验
- 预制菜顶流信良记,小龙虾的生意经难念
- 多个HTML页面公用头部尾部
- 每天一道面试题 浏览器输入URL到页面呈现详细过程
- ios手游退款有风险吗?
- Python:写了一个简易的同/环比分析器
- 这家刷脸入住的酒店,满屋都是黑科技
- 排斥原理c语言代码,包含排斥原理.ppt
- ubuntu下小企鹅输入法fcitx安装,以及重启后无法使用的问题解决