原子

走进原子性

二次信任 提交于 2020-01-29 13:48:27
走进原子性 问题:线程之间的协作 标准解决方法:上锁 实现一个计数器和互斥锁 locking的问题 硬件同步的早期 Compare and Swap(CAS) 用CAS来实现计数器 lock-free和wait-free算法 原子变量类 细颗粒度意味着轻量级 十五年前,多核处理器是特别的系统,需要花费成百上千的美元。今天,多核处理器系统又便宜又丰富,几乎每一个主要的微处理器都对并发有内部支持。 为了利用好多核的优势,软件也架构在多线程上。但是,仅仅将一个工作简单地划分为几个线程并不能发挥出硬件的优势-----你必须要确保你的线程大部分时间是在工作,而不是在等待工作,或者是在共享数据结构上等锁。 问题:线程之间的协作 几乎没有task能够真正地并发运行,不需要线程之间的协作。想象一个线程池,那里tasks是互相独立地运行的。假如一个线程池要为一个queue工作,那么为queue加入或者删除元素都必须是线程安全的,那意味着在head,tail,或者内部node的引用之间的协作。正是这样的协作导致了所有的问题。 标准解决方法:上锁 对于共享字段的协作获取的传统做法是通过synchronize,它确保所有对共享字段的获取都是拿着锁的状态。使用synchronize,你可以确保不管哪个保护着一些变量的线程取得锁,它都会对这些变量有着独享,而对这些变量的改变又会变成可见的

volatile关键字

吃可爱长大的小学妹 提交于 2020-01-28 20:42:38
一、简介 volatile是Java提供的一种轻量级的同步机制。Java 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级,因为它不会引起线程上下文的切换和调度。但是volatile 变量的同步性较差(有时它更简单并且开销更低),而且其使用也更容易出错。 二、并发编程的3个基本概念 (1)原子性 ​ 定义: 即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。 ​ 原子性是拒绝多线程操作的,不论是多核还是单核,具有原子性的量,同一时刻只能有一个线程来对它进行操作。简而言之,在整个操作过程中不会被线程调度器中断的操作,都可认为是原子性。例如 a=1是原子性操作,但是a++和a +=1就不是原子性操作。Java中的原子性操作包括: ​ a. 基本类型的读取和赋值操作,且赋值必须是数字赋值给变量,变量之间的相互赋值不是原子性操作。 ​ b.所有引用reference的赋值操作 ​ c.java.concurrent.Atomic.* 包中所有类的一切操作 (2)可见性 ​ 定义: 指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。 ​ 在多线程环境下

Java 原子操作类(atomic包)

十年热恋 提交于 2020-01-28 11:00:24
专栏原创出处: github-源笔记文件 , github-源码 ,欢迎 Star,转载请附上原文出处链接和本声明。 原子操作类说明 当程序更新一个变量时,如果是多线程同时更新这个变量,可能得到的结果与期望值不同。我们可以用 并发关键字-volatile 、 并发关键字-synchronized 、 Lock 来解决并发读写问题。 但是从性能及语义上可能存在以下问题: volatile 不能保证组合操作的原子性(比如自增操作) synchronized 和 Lock 比较重量级 从 java1.5 开始,jdk 提供了 java.util.concurrent.atomic 包,这个包中的原子操作类,提供了一种用法简单,性能高效,线程安全的更新一个变量的方式。 atomic 包里提供原子更新类型分别是:原子更新基本类型,原子更新数组,原子更新引用,原子更新属性,这些类都是使用 Unsafe 实现的包装类。 目前 jdk1.8 , Atomic 开头的原子类,提供的方法、处理逻辑基本一致。差异部分表现在非数值类型的原子类支持自增自减操作。 jdk1.8 中新增了高性能原子类,参考《高性能原子类》一节介绍。 原子更新基本类型 Atomic 包提供了以下 3 个类: AtomicBoolean:原子更新布尔类型。 AtomicInteger:原子更新整型。 AtomicLong

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

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

并发编程系列之七多线程原子类AtomicInteger与不能保证原子性的volatile【原子在多线程下发生争抢】

会有一股神秘感。 提交于 2020-01-20 16:35:53
并发编程系列之七多线程原子类AtomicInteger与不能保证原子性的volatile【原子在多线程下发生争抢】,原子类都在JUC里面的Atomic包下面,包括所有的原子类,基本类的7个都有的,volatile【原子在多线程下发生争抢】,之所以不能保证原子性,主要是因为工作内存与线程内存在多线程的资源分布下,交互时volatile在刷新工作内存的时候没有保证线程的前后顺序。发生谁得到谁刷新,导致原子性,顺序上发生前后不一致,导致数据不一致。 示例1.volatile不能保证原子性,主要发生在多线程的情况下,如果线程只有一个原子性问题不存在,代码主要是volatile使用时,多个线程得到的结果不能得到结果10000就是问题,注意一定要有多个线程运行时,这个问题才能被发现。 import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.atomic.AtomicInteger; /** * Create on 2020年1月20日下午12:02:40 @author 脚踏实地,2020涅槃重生 * @version 1.0 * * @Description: 并发编程系列 */ public class AchieveSynObjectForVolatile extends

Java多线程(5)

风格不统一 提交于 2020-01-19 18:35:07
Java多线程(5) CPU缓存一致性问题 因为缓存的出现,极大提高了CPU的吞吐能力,但同时也引入了缓存不一致的问题,比如i++操作 在程序运行过程,首先将主存中的数据复制一份存放到CPU Cache中,那么CPU寄存器进行数值计算的时候就直接到Cache中读取和写入,当整个运算过程完毕之后再讲Cache中的数据刷新到主存当中 具体如下: 读取主内存的i到cpu cache 对i进行+1操作 将结果写回到cpu cache中 将数据刷新到主内存 i++在单线程环境不会有什么问题,但在多线程下就会出现问题了 每个线程都有自己的工作内存,变量i会在多个线程的本地内存中都保存一个副本,如果同时两个线程执行i++操作,假设i的初始值为0,每一个线程都从主内存中获取i的值存入cpu cache,然后经过计算再写入主内存,很有可能i在经过了两次自增之后结果还是1,这就是典型的缓存不一致的问题 Java内存模型决定了一个线程对共享变量的写入何时对其他线程可见,Java内存模型定义了线程和主内存之间的抽象关系: 共享变量存储在主内存,每个线程都可以访问 每个线程都有私有的工作内存或者称为本地内存 工作内存只存储该线程对共享变量的副本 线程不能直接操作主内存,只有先操作了工作内存之后才能写入主内存 并发编程的三个重要特性 原子性 指在一次的操作或者多次操作中

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

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

Java并发--原子变量、CAS算法

老子叫甜甜 提交于 2020-01-17 01:36:28
并发编程中的原子性问题 测试:20个线程对一个普通int变量进行++操作。 package pers . zhang . juc . part1 ; /** * @author zhang * @date 2020/1/16 - 17:52 * * 并发编程中的原子性问题 */ public class TestAtomicDemo { public static void main ( String [ ] args ) { AtomicDemo ad = new AtomicDemo ( ) ; for ( int i = 0 ; i < 20 ; i ++ ) { new Thread ( ad , "thread" + i ) . start ( ) ; } } } class AtomicDemo implements Runnable { private int serialNumber = 0 ; @Override public void run ( ) { try { Thread . sleep ( 200 ) ; } catch ( InterruptedException e ) { e . printStackTrace ( ) ; } System . out . println ( Thread . currentThread ( ) .

线程安全的原子性、可见性与有序性

本秂侑毒 提交于 2020-01-15 04:16:36
原子性: 一个或多个操作在CPU执行过程中不被中断的特性称之为原子性 。线程中执行的操作要么全部执行,要么全部不执行。 Java内存模型中的read、load、assign、use、store和write都可以保证原子性的操作(如果对Java内存模型不熟悉,可以参考我的这篇博文 Java内存模型 ),一般基本数据类型访问读写都是原子性的(long和double的非原子性协议例外,但是基本也不会发生) 如果应用场景需要一个更大范围的原子性保证,我们可以直接使用synchronized关键字,在synchronized块之间的操作也具有原子性。 可见性: 可见性是指当一个线程修改了共享变量的值,其他线程能够立即得知这个修改。 Java内存模型是通过变量修改之后同步回主内存,在变量读取之前从主内存刷新变量值来实现可见性的。如果一个普通变量在多线程中运行的话,往往不能保证可见性,多个线程都是从主内存中获取变量,这时多个线程并不会先等待某一个线程修改完变量之后,写回主内存,再从主内存获取最新的变量值。 如果要保证可见性的话,我们可以使用volatile关键字,具体原理可以参考我的这篇博文 Java的volatile关键字 ,当然除了volatile关键字之外,synchronized和final关键字也能实现可见性

Redis>使用总结(优缺点)

被刻印的时光 ゝ 提交于 2020-01-14 18:38:23
优点 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。 缺点 1.作为非关系型数据库,不支持条件查询 来源: CSDN 作者: arize 链接: https://blog.csdn.net/qq_42069216/article/details/103974196