原子

CAS及ABA问题

╄→гoц情女王★ 提交于 2020-01-13 05:25:04
CAS 并发中线程安全必须保证三个要素, 原子性、可见性、有序性 。使用volatile可以保证可见性和有序性,但是不能保证原子性。所以还是会出现并发修改紊乱的问题。 这里的解决方法可以通过synchronized修饰,但是太重了,所以使用原子类保证原子性即可,但是原子类底层是如何保证原子性的值得研究,首先一点就是CAS。 CAS是什么 campareAndSwap. JDK8,在AtomicInteger类中有一个getAndAdd()方法,点进去,可以看到: public class AtomicInteger extends Number implements java . io . Serializable { private static final long serialVersionUID = 6214790243416807050 L ; // setup to use Unsafe.compareAndSwapInt for updates private static final Unsafe unsafe = Unsafe . getUnsafe ( ) ; private static final long valueOffset ; static { try { valueOffset = unsafe . objectFieldOffset (

去哪里寻找不可能的分子?

元气小坏坏 提交于 2020-01-12 21:16:53
  1   元素周期表的最后一列是一类“扫兴”的元素,它们被统称为<strong>惰性气体</strong>。大多数元素的原子会和其他原子共享电子,形成化学键,从而构成分子,而<strong>惰性气体原子的最外层的电子本身已经达到“满”的状态,因此它们自身就极其稳定,很少发生化学反应,很难与其他原子结合形成分子</strong>。   在地球上,还没有发现天然形成的惰性气体化合物。从上个世纪开始,科学家就在实验室中尝试将惰性气体的原子合成分子。1925 年,科学家在实验室中设法让氦(He)与氢离子(H?)共享一个电子,合成了第一个<strong>氦合氢离子</strong>(HeH?)。天文学家将氦合氢离子称为“分子”,但由于它并不是电中性的,化学家更愿意称之为“分子离子”。   1962 年,化学家<strong>尼尔·巴特利特</strong>(Neil Bartlett)诱导氙(Xe)、氟和铂结合,得到了一个芥黄色的化合物——<strong>六氟合铂酸氙</strong>,这是一个电中性分子,也是第一个电中性的惰性气体化合物分子。   但在宇宙中,情况可能大不一样。太空是一个寻找惰性气体化合物分子的绝佳场所。惰性气体元素在宇宙中十分丰富。氦是仅次于氢的宇宙中第二丰富的元素,氖(Ne)的丰度大约排在第五或第六名。在星际空间中,温度和密度时常达到极端情况

拒绝“合群”,IBM基础科技创新如何改变世界?

亡梦爱人 提交于 2020-01-12 01:49:09
罗伯特·登纳德(Robert H. Dennard) 基础科技创新,永远是人类社会前进的驱动力之一。在现代基础科技进步史上,IBM公司不断留下了永久性的脚印。而IBM基础科技创新的核心理念之一就是拒绝“合群”,这就是“野鸭”精神。IBM公司历史上著名CEO小托马斯·J·沃森(Thomas J. Watson Jr.),以此来比喻那些具有创新精神的IBM员工,也就是那些拒绝飞行在“群体阵形”的跟随者。 2019年11月,IBM托马斯·沃森研究中心的研究员、被喻为内存之父的罗伯特·登纳德(Robert H. Dennard)博士被美国半导体行业协会(SIA)授予2019年半导体行业最高荣誉奖——Robert N. Noyce Award。正是登纳德于1966年构思了DRAM(动态随机存储存取器),才有了今天占据全球半导体产业1/4江山、千亿美元规模的内存市场,才有了后来的英特尔、AMD、三星、东芝、镁光、LG、英飞凌等一批半导体巨头公司。 登纳德于1972年又构思了著名的缩放定律(Dennard Scaling),由此奠定了摩尔定律的数学与物理基础,催生了后来更小、更经济、更可靠的存储器和高性能处理器,也实际上奠定了后来繁荣的半导体产业,推动世界进入了信息文明时代。2017年3月,在经过了近50年后,IBM研究员在《自然科学》上发表了可商用原子存储的阶段性研究成果

14 半导体器件

大憨熊 提交于 2020-01-11 09:00:13
文章目录 14.1 半导体的导电特性 14.1.1本征半导体 14.1.2 N型半导体和P型半导体 练习与思考 14.2 PN结及其单向导电性 14.3 二极管 14.3.1基本结构 14.3.2伏安特性 14.3.3主要参数 14.1 半导体的导电特性 半导体, 导电能力介于导体和绝缘体间。 硅、锗、硒及大多数金属氧化物和 硫化物   有些半导体(钴、锰、镍等的氧化物)对温度的反应灵敏,温度增高时,导电能力要强很多。 做成各种热敏电阻。 有些半导体(如镉、铅等的硫化物与硒化物)受光照时, 导电能力变很强; 无光照时,又变得像绝缘体那样不导电。 做成了各种光敏电阻。   在纯浄的半导体中掺入微量的杂质后,导电能力就可增几十万乃至几百万倍。 纯硅中摻百万分之一的硼后,电阻率从 2 × 1 0 3 Ω ⋅ m 2\times 10^{3}\Omega\cdot m 2 × 1 0 3 Ω ⋅ m 减小到 4 x 1 0 − 3 4x10^{-3} 4 x 1 0 − 3 就做成不同用途的半导体器件, 二极管、双极型晶体管、场效晶体管及晶闸管   半导体何以有如此悬殊的导电特性? 根本原因在于事物内部的特殊性。 简单介绍一下半导体物质的内部结构和导电机理。 14.1.1本征半导体 用得最多的半导体是锗和硅。 锗和硅的原子结构图,各有四个价电子,四价元素。 将锗或硅材料提纯(去掉无用杂质

java并发-原子性

走远了吗. 提交于 2020-01-10 19:30:41
原子性就是指该操作是不可再分的。 java.util.concurrent.atomic中有一组使用无锁算法实现的原子操作类。AtomicInteger、AtomicBoolean、AtomicLong 外还有 AtomicReference 。它们分别封装了对整数、整数数组、长整型、长整型数组和普通对象的多线程安全操作。 这些都是居于CAS算法实现的。CAS即:Compare and Swap,是比较并交换的意思。 CAS 简介 CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。 非阻塞算法 (nonblocking algorithms) 一个线程的失败或者挂起不应该影响其他线程的失败或挂起的算法。 现代的CPU提供了特殊的指令,可以自动更新共享数据,而且能够检测到其他线程的干扰,而 compareAndSet() 就用这些代替了锁定。 拿出AtomicInteger来研究在没有锁的情况下是如何做到数据正确性的。 private volatile int value; 首先毫无以为,在没有锁的机制下可能需要借助volatile原语,保证线程间的数据是可见的(共享的)。 这样才获取变量的值的时候才能直接读取。 public final int get() { return value; } 然后来看看

并发编程的基石——CAS机制

折月煮酒 提交于 2020-01-10 04:11:46
本博客系列是学习并发编程过程中的记录总结。由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅。 并发编程系列博客传送门 Java中提供了很多原子操作类来保证共享变量操作的原子性。这些原子操作的底层原理都是使用了CAS机制。在使用一门技术之前,了解这个技术的底层原理是非常重要的,所以本篇博客就先来讲讲什么是CAS机制,CAS机制存在的一些问题以及在Java中怎么使用CAS机制。 其实Java并发框架的基石一共有两块,一块是本文介绍的CAS,另一块就是AQS,后续也会写博客介绍。 什么是CAS机制 CAS机制是一种数据更新的方式。在具体讲什么是CAS机制之前,我们先来聊下在多线程环境下,对共享变量进行数据更新的两种模式:悲观锁模式和乐观锁模式。 悲观锁更新的方式认为:在更新数据的时候大概率会有其他线程去争夺共享资源,所以悲观锁的做法是:第一个获取资源的线程会将资源锁定起来,其他没争夺到资源的线程只能进入阻塞队列,等第一个获取资源的线程释放锁之后,这些线程才能有机会重新争夺资源。synchronized就是 java 中悲观锁的典型实现,synchronized使用起来非常简单方便,但是会使没争抢到资源的线程进入阻塞状态,线程在阻塞状态和Runnable状态之间切换效率较低(比较慢)。比如你的更新操作其实是非常快的

JUC 中的 Atomic 原子类总结

∥☆過路亽.° 提交于 2020-01-10 00:11:16
1 Atomic 原子类介绍 Atomic 翻译成中文是原子的意思。在化学上,我们知道原子是构成一般物质的最小单位,在化学反应中是不可分割的。在我们这里 Atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。 所以,所谓原子类说简单点就是具有原子/原子操作特征的类。 并发包 java.util.concurrent 的原子类都存放在 java.util.concurrent.atomic 下,如下图所示。 根据操作的数据类型,可以将JUC包中的原子类分为4类 基本类型 使用原子的方式更新基本类型 AtomicInteger:整型原子类 AtomicLong:长整型原子类 AtomicBoolean :布尔型原子类 数组类型 使用原子的方式更新数组里的某个元素 AtomicIntegerArray:整型数组原子类 AtomicLongArray:长整型数组原子类 AtomicReferenceArray :引用类型数组原子类 引用类型 AtomicReference:引用类型原子类 AtomicReferenceFieldUpdater:原子更新引用类型里的字段 AtomicMarkableReference :原子更新带有标记位的引用类型 对象的属性修改类型 AtomicIntegerFieldUpdater

原子类型字段更新器AtomicXxxxFieldUpdater

老子叫甜甜 提交于 2020-01-08 19:45:51
本博客系列是学习并发编程过程中的记录总结。由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅。 并发编程系列博客传送门 原子类型字段更新器 在 java.util.concurrent.atomic 中,原子类型字段更新器有以下三种: AtomicIntegerFieldUpdater:基于反射的工具类,可以原子性的更新指定对象的指定int类型字段。 AtomicLongFieldUpdater:基于反射的工具类,可以原子性的更新指定对象的指定long类型字段。 AtomicReferenceFieldUpdater:基于反射的工具类,可以原子性的更新指定对象的指定应用类型字段。 使用规则 原子类型字段更新器在内部通过Unsafe类的native方法保证操作的原子性。 关于原子类型字段更新器的使用需要注意以下几个方面: 字段必须是volatile类型的,用于保证可见性。 字段和字段更新器的访问类型(public/protected/private)必须一致。 字段只能是实例变量,不能是类变量(static)。 字段不能是final的变量,这样的字段不可修改。 如果要处理Integer和Long类型,则需要使用AtomicReferenceFieldUpdater 使用列子(以AtomicIntegerFieldUpdater为列) public class

并发编程的灵魂:CAS机制详解

生来就可爱ヽ(ⅴ<●) 提交于 2020-01-08 18:43:51
Java中提供了很多原子操作类来保证共享变量操作的原子性。这些原子操作的底层原理都是使用了CAS机制。在使用一门技术之前,了解这个技术的底层原理是非常重要的,所以本篇文章就先来讲讲什么是CAS机制,CAS机制存在的一些问题以及在Java中怎么使用CAS机制。 其实Java并发框架的基石一共有两块,一块是本文介绍的CAS,另一块就是AQS,后续也会写文章介绍。 什么是CAS机制 CAS机制是一种数据更新的方式。在具体讲什么是CAS机制之前,我们先来聊下在多线程环境下,对共享变量进行数据更新的两种模式:悲观锁模式和乐观锁模式。 悲观锁更新的方式认为:在更新数据的时候大概率会有其他线程去争夺共享资源,所以悲观锁的做法是:第一个获取资源的线程会将资源锁定起来,其他没争夺到资源的线程只能进入阻塞队列,等第一个获取资源的线程释放锁之后,这些线程才能有机会重新争夺资源。synchronized就是java中悲观锁的典型实现,synchronized使用起来非常简单方便,但是会使没争抢到资源的线程进入阻塞状态,线程在阻塞状态和Runnable状态之间切换效率较低(比较慢)。比如你的更新操作其实是非常快的,这种情况下你还用synchronized将其他线程都锁住了,线程从Blocked状态切换回Runnable华的时间可能比你的更新操作的时间还要长。 乐观锁更新方式认为

ConcurrentHashMap的CAS操作

夙愿已清 提交于 2020-01-08 14:36:27
无锁的概念   在谈论无锁概念时,总会关联起乐观派与悲观派,对于乐观派而言,他们认为事情总会往好的方向发展,总是认为坏的情况发生的概率特别小,可以无所顾忌地做事,但对于悲观派而已,他们总会认为发展事态如果不及时控制,以后就无法挽回了,即使无法挽回的局面几乎不可能发生。   这两种派系映射到并发编程中就如同加锁与无锁的策略,即加锁是一种悲观策略,无锁是一种乐观策略,因为对于加锁的并发程序来说,它们总是认为每次访问共享资源时总会发生冲突,因此必须对每一次数据操作实施加锁策略。 而无锁则总是假设对共享资源的访问没有冲突,线程可以不停执行,无需加锁,无需等待,一旦发现冲突,无锁策略则采用一种称为CAS的技术来保证线程执行的安全性,这项CAS技术就是无锁策略实现的关键,下面我们进一步了解CAS技术的奇妙之处。 无锁的执行者-CAS 介绍CAS CAS的全称是Compare And Swap 即比较交换,其算法核心思想如下 执行函数:CAS(V,E,N) 其包含3个参数 V表示要更新的变量 E表示预期值 N表示新值 如果V值等于E值,则将V的值设为N。若V值和E值不同,则说明已经有其他线程做了更新,则当前线程什么都不做。 通俗的理解就是CAS操作需要我们提供一个期望值,当期望值与当前线程的变量值相同时,说明还没线程修改该值,当前线程可以进行修改,也就是执行CAS操作,但如果期望值与当前线程不符