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并行程序基础(十二)相关推荐

  1. shadowplay要下载java_Java并发程序设计(二)Java并行程序基础

    Java并行程序基础 一.线程的生命周期 其中blocked和waiting的区别: 作者:赵老师 链接:https://www.zhihu.com/question/27654579/answer/ ...

  2. Java并发程序设计(二)Java并行程序基础

    Java并行程序基础 一.线程的生命周期 其中blocked和waiting的区别: 作者:赵老师 链接:https://www.zhihu.com/question/27654579/answer/ ...

  3. (二)Java并行程序基础

    Java并行程序基础 2.1 线程和进程 2.2 初始线程 2.2.1 新建线程 2.2.2 线程中断 2.2.3 等待(wait)和通知(notify) 2.2.4 挂起(suspend)和继续执行 ...

  4. Java并行程序基础

    有关线程 进程是计算机中的程序关于某数据集合上的一次运动活动,是系统进行资源分配的基础单位.进程是线程的容器.程序是指令.数据及其组织形式的描述,进程是程序的实体. 线程的生命周期 线程的所有状态都在 ...

  5. java负数右移_收入囊中篇---Java程序基础(二)

    前言: 本篇是接着上一篇更新的,如果没有阅读上一篇的话,可以查阅或回顾一下. 1.收入囊中篇---Java基础必备知识(一) 2.收入囊中篇---Java程序基础(二) Java程序基础目录 1.Ja ...

  6. JVM 内部原理(七)— Java 字节码基础之二

    JVM 内部原理(七)- Java 字节码基础之二 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者.架构师.CxO 还是智能手机的普通用户,Java ...

  7. 【JAVA SE】第十二章 流(Stream)、IO流和文件(File)

    第十二章 流(Stream).IO和文件(File) 文章目录 第十二章 流(Stream).IO和文件(File) 一.流(Stream) 1.什么是流 2.流的分类 二.IO流 1.字节输入流(I ...

  8. 201771010101白玛次仁《面向对象程序设计(java)》第十二周实验总结

    实验十二  图形程序设计 实验时间 2018-11-14 学习总结: 1.Java的抽象口工具箱( Abstract WindowToolkit, AWT)包含在java.awt包中,它提供了许多用来 ...

  9. java面向对象程序基础实验_20165115 实验二《Java面向对象程序设计》实验报告

    20165115 实验二 面向对象程序设计 这一次的实验,老师按照实验内容的不同将实验分成了五个部分进行.五个部分的侧重难易都有区别,实验报告中的叙述也会有所区别. 第一部分 先上实验结果截图: 这一 ...

最新文章

  1. JavaScript之Unspecified error或无法设置selected属性。未指明的错误。解决方案
  2. 【云栖大会】阿里云成为全国首家云等保试点示范平台
  3. 怎么修改_PDF怎么修改文字?其实修改PDF内容很简单
  4. putty 中文乱码
  5. java线程池使用实战,太牛了!
  6. VM虚拟机中 localhost login_UTM 2.0 虚拟机来了,解决上网和无声音问题
  7. vscode生成vue模板快捷键_VSCode一键生成.vue模版
  8. 小学认识计算机说课ppt,“认识计算机”说课稿.ppt
  9. 创业有感-表达能力很关键
  10. 创建微服务架构的步骤_如何快速搭建一个微服务架构?
  11. 消息队列-简单介绍Java消息队列,什么是消息队列,作用以及常见消息队列
  12. 时间序列数据的白噪声检验
  13. 预制菜顶流信良记,小龙虾的生意经难念
  14. 多个HTML页面公用头部尾部
  15. 每天一道面试题 浏览器输入URL到页面呈现详细过程
  16. ios手游退款有风险吗?
  17. Python:写了一个简易的同/环比分析器
  18. 这家刷脸入住的酒店,满屋都是黑科技
  19. 排斥原理c语言代码,包含排斥原理.ppt
  20. ubuntu下小企鹅输入法fcitx安装,以及重启后无法使用的问题解决

热门文章

  1. 把现有的typesctipt+react项目接入到electron
  2. R数据可视化--ggplot2定位之坐标系详解
  3. 手机APP新“战场” 手机银行APP成了银行业的定时炸弹?
  4. 粗略的看下两款Linux下的性能分析工具
  5. iptables从入门到精通
  6. 給曾經的三年,寫點什么吧。-紀念華軟
  7. OpenShift — 核心概念
  8. Go 语言编程 — 高级数据类型 — 指针
  9. 串口的硬件流控和软件流控
  10. stm32对flash的读写保护与解除