原子

java并发编程-12个原子类

大憨熊 提交于 2019-12-06 20:04:27
背景 多线程更新变量的值,可能得不到预期的值,当然增加syncronized关键字可以解决线程并发的问题。 这里提供另外一种解决问题的方案,即位于 java.util.concurrent.atomic包下的原子操作类,提供了一种用法简单,性能高效,线程安全的更新变量的方式。 其它两个附带的类顺带看了一下: LongAddr 多线程先的sum操作 LongAccomulator 多线程下的函数式操作,性能低于AtomicLong,主要是函数式的支持; 简单分类: 基本类型原子类 使用原子的方式更新基本类型,包括: AtomicBoolean AtomicInteger AtomicLong 核心方法: 直接看源码了。 类签名: public class AtomicInteger extends Number implements java.io.Serializable {} 方法 功能说明 构造方法 两个构造方法,不传或者传入值 get方法 get()获取值;对应的有set(int)方法,layzySet(int) 懒设置 getAndAdd(int) 获得老值然后增加一个数字, 对应的有addAndGet(int)增加一个数字并返回新值 getAndSet(int) 获得老值然后更新为新值 getAndIncreament() 获得老值然后+1

化学2.0

余生颓废 提交于 2019-12-06 05:37:50
八下第二单元部分 部分元素核电荷数、名称及其符号 1 氢H 2氦He 3锂Li 4铍Be 5硼B 6 碳C 7氮N 8氧O 9氟F 10氖Ne 11 钠Na 12镁Mg 13铝Al 14硅Si 15磷P 16 硫S 17氯Cl 18氩Ar 19钾K 20钙Ca 21 钪(kàng) Sc 22钛Ti 23钒( f án) V 24铬( g è) Cr 25锰Mn 26 铁Fe 27钴( g ǔ) Co 28镍( ni è) Ni 29铜Cu 30锌Zn 31 镓( ji ā) Ga 32锗( zh ě) Ge 33砷( sh ēn) As 34硒Se 35溴Br 36 氪Kr 47 银Ag 50锡Sn 53碘I 56钡Ba 74钨W 79 金Au 80汞Hg 82铅Pb 第一主族:锂钠钾铷(Rb)铯(Cs)钫(Fr). 稀有气体:氦氖氩氪氙(Xe)氡(Rn). 卤族气体:氟氯溴碘砹(At). 部分元素常见化合价 钾 钠 银 氢 +1 价 氟 氯 溴 碘 -1 价 钙 镁 钡 锌 +2 价 1 2 铜 2 3 铁 2 4 碳 -2 氧 3 铝 4 硅 5 磷 4 7 锰 -2 4 6 硫 -3 5 氮 原子团 氢氧 根离子 OH - -1 硫 酸根离子 SO 4 2- -2 硝 酸根离子 NO 3 - -1 碳 酸根离子 CO 3 2- -2 碳 酸氢根离子 HCO 3 - -1

化学2.1

大城市里の小女人 提交于 2019-12-06 05:37:34
杂 (1) 金属活动性K Ca Na Mg Al Zn Fe SnPb H Cu Hg Ag Pt Cu (2) 静电作用形成化合物。 (3) 元素的化学性质主要决定于原子的 最外层电子数 。 (4) 有机物:含C,有活性。 (5) 同种物质在氧气中燃烧程度比在空气中剧烈。 说明:物质在空气中燃烧,实际上是与其中的氧气发生反应,氧气浓度越高,反应越剧烈 碳,硫在空气中的燃烧程度比铁剧烈。 说明:碳,硫比铁的化学性质活泼 1 关于微粒半径比较 (1) 电子层数越多,半径越大。如:K>Na (2) 电子层数相同时,再比较核电荷数,核电荷数越多,半径越小。如:S 2- >Cl - >K + >Ca 2+ (3) 核电荷数相同时,比较电子数,电子越多半径越大。如:Cl - >Cl 2 氧气在空气中含量的测定 α:拉瓦锡实验 (1) 银色液态汞连续加热12天,发现部分汞变成红色粉末(氧化汞)。汞槽中水银上升钟罩剩余空间的1/5。拉瓦锡得出空气是由氧气和氮气组成,其中氧气占总体积的1/5的结论。 (2) 现代氧气在空气中含量测定方法 :红磷与空气中的氧气反应生成固体五氧化二磷,消耗氧气。 发出黄光,冒出大量白烟,生成白色固体。 打开弹簧夹后,水顺着导管流入集气瓶, 进入集气瓶中水的体积约瓶内空间的1/5。 3 部分气体性质和用途 (1) 氮气 物理性质:无色、无味的气体。难溶于水,熔沸点低

化学2.2

馋奶兔 提交于 2019-12-06 05:37:30
离子方程式 (1) H + +OH - =H 2 O (2) 2H + +CO 3 2- =H 2 O+CO 2 ↑ (3) NH 4 + +OH - =NH 3 ↑(有刺激性)+H 2 O (4) Ba 2+ +SO 4 2- =BaSO 4 ↓(不溶于稀HNO 3 的白色沉淀) (5) Ba 2+ +CO 3 2- =BaCO 3 ↓ (6) Ca 2+ +CO 3 2- =CaCO 3 ↓ (7) Mg 2+ +2OH - =Mg(OH) 2 ↓ (8) Al 3+ +3OH - =Al(OH) 3 ↓ (9) Fe 3+ +3OH - =Fe(OH) 3 ↓(红褐色絮状沉淀) (10) Cu 2+ +2OH - =Cu(OH) 2 ↓(蓝色絮状沉淀) (11) Ag + +Cl - =AgCl ↓(不溶于稀HNO 3 的白色沉淀) 杂 (1) 金属活动性K Ca Na Mg Al Zn Fe SnPb H Cu Hg Ag Pt Cu (2) 静电作用形成化合物。 (3) 元素的化学性质主要决定于原子的 最外层电子数 。 (4) 有机物:含C,有活性。 (5) 同种物质在氧气中燃烧程度比在空气中剧烈。 说明:物质在空气中燃烧,实际上是与其中的氧气发生反应,氧气浓度越高,反应越剧烈 碳,硫在空气中的燃烧程度比铁剧烈。 说明:碳,硫比铁的化学性质活泼 1 关于微粒半径比较 (1

化学1.0

十年热恋 提交于 2019-12-06 05:36:49
部分元素核电荷数、名称及其符号 1 氢H 2氦He 3锂Li 4铍Be 5硼B 6 碳C 7氮N 8氧O 9氟F 10氖Ne 11 钠Na 12镁Mg 13铝Al 14硅Si 15磷P 16 硫S 17氯Cl 18氩Ar 19钾K 20钙Ca 21 钪(kàng) Sc 22钛Ti 23钒( f án) V 24铬( g è) Cr 25锰Mn 26 铁Fe 27钴( g ǔ) Co 28镍( ni è) Ni 29铜Cu 30锌Zn 31 镓( ji ā) Ga 32锗( zh ě) Ge 33砷( sh ēn) As 34硒Se 35溴Br 36 氪Kr 47 银Ag 50锡Sn 53碘I 56钡Ba 74钨W 79 金Au 80汞Hg 82铅Pb 第一主族:锂钠钾铷(Rb)铯(Cs)钫(Fr). 稀有气体:氦氖氩氪氙(Xe)氡(Rn). 部分元素常见化合价 钾 钠 银 氢 +1 价 氟 氯 溴 碘 -1 价 钙 镁 钡 锌 +2 价 1 2 铜 2 3 铁 2 4 碳 -2 氧 3 铝 4 硅 5 磷 4 7 锰 -2 4 6 硫 -3 5 氮 原子团 氢氧 根离子 OH - -1 硫 酸根离子 SO 4 2- -2 硝 酸根离子 NO 3 - -1 碳 酸根离子 CO 3 2- -2 碳 酸氢根离子 HCO 3 - -1 铵根离子 NH 4 + +1 氯酸根离子 ClO 3

聊聊并发(五)原子操作的实现原理

僤鯓⒐⒋嵵緔 提交于 2019-12-06 03:30:46
##引言## 原子(atom)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为”不可被中断的一个或一系列操作” 。在多处理器上实现原子操作就变得有点复杂。本文让我们一起来聊一聊在Inter处理器和Java里是如何实现原子操作的。 ##术语定义## 缓存行 :缓存的最小操作单位。 比较并交换 :CAS操作需要输入两个数值,一个旧值(期望操作前的值)和一个新值,在操作期间先比较下在旧值有没有发生变化,如果没有发生变化,才交换成新值,发生了变化则不交换。 CPU流水线 :CPU流水线的工作方式就象工业生产上的装配流水线,在CPU中由5~6个不同功能的电路单元组成一条指令处理流水线,然后将一条X86指令分成5~6步后再由这些电路单元分别执行,这样就能实现在一个CPU时钟周期完成一条指令,因此提高CPU的运算速度。 内存顺序冲突 :内存顺序冲突一般是由假共享引起,假共享是指多个CPU同时修改同一个缓存行的不同部分而引起其中一个CPU的操作无效,当出现这个内存顺序冲突时,CPU必须清空流水线。 ##处理器如何实现原子操作## 32位IA-32处理器使用基于对 缓存加锁 或 总线加锁 的方式来实现多处理器之间的原子操作。 ###处理器自动保证基本内存操作的原子性### 首先处理器会自动保证基本的内存操作的原子性

java如何实现原子操作CAS

蹲街弑〆低调 提交于 2019-12-06 03:30:34
在Java中可以通过锁和循环CAS的方式来实现原子操作。 使用循环CAS实现原子操作 JVM中的CAS操作正是利用了处理器提供的CMPXCHG指令实现的。自旋CAS实现的基本思路就是循环进行CAS操作直到成功为止。 CAS实现原子操作的三大问题 ABA问题,循环时间长开销大,以及只能保证一个共享变量的原子操作。 ABA问题 因为CAS需要在操作值的时候,检查值有没有发生变化,如果没有发生变化 则更新,但是如果一个值原来是A,变成了B,又变成了A,那么使用CAS进行检查时会发现它 的值没有发生变化,但是实际上却变化了。ABA问题的解决思路就是使用版本号。在变量前面 追加上版本号,每次变量更新的时候把版本号加1,那么A→B→A就会变成1A→2B→3A。从 Java 1.5开始,JDK的Atomic包里提供了一个类AtomicStampedReference来解决ABA问题。这个 类的compareAndSet方法的作用是首先检查当前引用是否等于预期引用,并且检查当前标志是 否等于预期标志,如果全部相等,则以原子方式将该引用和该标志的值设置为给定的更新值。 public boolean compareAndSet( V expectedReference, // 预期引用 V newReference, // 更新后的引用 int expectedStamp, // 预期标志 int

Java实现原子操作

不想你离开。 提交于 2019-12-06 03:30:23
Java实现原子操作 什么是原子操作 http://www.infoq.com/cn/articles/atomic-operations-and-contention 计算机操作最重要的构成单位是原子操作。这里的原子跟物理上说的原子没有任何关系,而是起源于单词atom,也就是希腊语“ἄτομος”(意为不可见的)。原子操作是一种不可再细分的操作,或者在系统中其他处理器看来是不可再分了。为了说明为什么原子操作很重要,考虑两个处理器以几乎相同的方式增加一个计数器,翻译成C语言就是counter++,此时会发生什么: 指令周期 处理器一 处理器二 0 reg = load(&counter); 1 reg = reg + 1; reg = load(&counter); 2 store(&counter, reg); reg = reg + 1; 3 store(&counter, reg); 在编译好的代码中, 这样一个操作分为:读操作、寄存器自加,最后是一个写操作(这里用类似C语言的伪代码表示)。 这三个步骤是独立且按顺序执行的(注意,对于x86来说,在更微观的架构层次上这句话是正确的,但是在指令集架构的层次上,这三步看起来可以用一条“读-修改-写(read-modify-write)”指令完成:add [memory], value)。并且因为这些操作被分成多个指令周期来执行

gcc原子操作测试

删除回忆录丶 提交于 2019-12-06 02:40:43
1 #include <stdio.h> 2 #include <pthread.h> 3 #include <stdlib.h> 4 5 static int count = 0; 6 7 void *test_func(void *arg) 8 { 9 int i=0; 10 for(i=0; i < 20000; i++) { 11 __sync_fetch_and_add(&count,1); 12 //count++; 13 } 14 return NULL; 15 } 16 17 int main(int argc, const char *argv[]) 18 { 19 pthread_t id[20]; 20 int i = 0; 21 22 for(i=0; i < 20; i++) { 23 pthread_create(&id[i],NULL,test_func,NULL); 24 } 25 26 for(i=0; i<20; ++i) { 27 pthread_join(id[i],NULL); 28 } 29 30 printf("%d\n",count); 31 return 0; 32 } 参考链接:https://blog.csdn.net/youfuchen/article/details/23179799 来源: https://www

Java并发编程系列:Java原子类

≯℡__Kan透↙ 提交于 2019-12-05 22:57:02
一、线程不安全 当多个线程访问统一资源时,如果没有做线程同步,可能造成线程不安全,导致数据出错。举例: @Slf4j public class ThreadUnsafe { // 用于计数的统计变量 private static int count = 0; // 线程数量 private static final int Thread_Count = 10; // 线程池 private static ExecutorService executorService = Executors.newCachedThreadPool(); // 初始化值和线程数一致 private static CountDownLatch downLatch = new CountDownLatch(Thread_Count); public static void main(String[] args) throws Exception{ for (int i = 0; i < Thread_Count; i++) { executorService.execute(() -> { for (int j = 0; j < 1000; j++) { // 每个线程执行1000次++操作 count++; } // 一个线程执行完 downLatch.countDown(); }); } //