原文连接:(http://www.studyshare.cn/blog-front/blog/details/1166/0 )
一、原子操作是什么?

如果有两个线程分别执行两个操作A和B,从第一个线程执行A操作的角度来看,另外一个线程执行B操作,要么将B操作执行完,要么B操作

压根儿不执行,那么A操作和B操作对彼此来讲就是原子的。

二、原子操作如何实现?

1、使用锁:锁机制就是将一个操作执行完毕后,其他操作获取锁然后继续执行,通过对多个操作进行隔离,从而实现原子操作。

2、CAS:CAS是Compare And Swap的简称,即:比较并交换。这是当前的处理器基本都支持的一种指令。每个CAS指令包括三个运算符,

一个内存地址V,一个期望值A和一个新值B,CAS指令执行的时候是去判断这个地址V上的值和期望值A是否相等,相等则将地址V上的值修

改为新值B,不等则不作任何操作。CAS操作实际实现是在一个循环中不断执行CAS指令,直到成功为止。

三、为什么要使用原子操作?

1、我们知道原子操作可以通过锁来实现,但锁是一种粗粒度的操作,使用锁会存在一些问题,例如:(1)当一个线程占用了锁资源,其他

线程就被阻塞,然而被阻塞的线程的优先级又很高。此时也只能等待锁释放。如果获得锁的线程一致不释放的话那情况就更糟糕了。(2)如

果有大量的线程来竞争资源,那么CPU就需要花费大量的时间和资源来处理这些竞争。这对CPU这种稀缺资源是不利的。

2、如果我们要实现一个多线程下的程序计数器。使用锁机制无疑是笨重的。那么CAS就能很好的解决这种需求。

3、JDK的源码中非常多的类中都使用了CAS操作,了解并清楚CAS操作对阅读JDK源码是必要的。

四、CAS如何实现线程安全?

CAS实现线程安全不在代码层面处理,而是交给硬件-CPU和内存,利用CPU的多处理能力,实现硬件层面的阻塞,然后加上volidate变量的

特性即可实现基于原子操作的线程安全。

五、CAS实现原子操作的三大问题

1、ABA问题:因为CAS在操作值的时候先要检查值有没有发生变化,如果没有发生变化则更新,那么所谓ABA问题就是当原来的值是A,改变

成B,然后又改变成A,那么CAS检查的时候发现值还是初始的A,并没有发生变化。然后实际上却是已经变化了。如何解决ABA问题:加版本

号,即在A变成B再变成A的时候,每一步操作加一个version,即:1A->2B->3A,这样就可以根据版本号是否有变化即可判断是否发生了ABA问题。

2、循环时间长、开销大:上面说过是在一个循环中不断执行CAS指令(自旋CAS),如果长时间都不成功的话,则会对CPU带来很大的执行开销。

3、只能保证一个共享变量的原子操作:即一个CAS操作只能保证一个共享变量的的原子性。如果有多个共享变量则不能使用CAS操作,可使用

锁。也可以将多个共享变量合并然后使用CAS操作。java1.5之后提供了AtomicReference类来保证引用对象之间的原子性。可以将多个变量放进

一个对象中然后进行CAS操作。

六、JDK中常见原子操作类的使用

1、AtomicInteger

•int addAndGet(int delta):以原子方式将输入的数值与实例中的值(AtomicInteger里的value)相加,并返回结果。

•boolean compareAndSet(int expect,int update):如果输入的数值等于预期值,则以原子方式将该值设置为输入的值。

•int getAndIncrement():以原子方式将当前值加1,注意,这里返回的是自增前的值。

•int getAndSet(int newValue):以原子方式设置为newValue的值,并返回旧值。

2、AtomicIntegerArray

主要是提供原子的方式更新数组里的整型,其常用方法如下。

•int addAndGet(int i,int delta):以原子方式将输入值与数组中索引i的元素相加。

•boolean compareAndSet(int i,int expect,int update):如果当前值等于预期值,则以原子方式将数组位置i的元素设置成update值。

需要注意的是,数组value通过构造方法传递进去,然后AtomicIntegerArray会将当前数组复制一份,所以当AtomicIntegerArray对内部的数组元

素进行修改时,不会影响传入的数组。

3、AtomicReference

原子更新引用类型,更多具体使用可查看jdk文档

更多原子操作类,在jdk文档java.util.concurrent.atomic包下。

原创文章,转载请注明出处。
java开发工具下载地址及安装教程大全,点这里
更多深度技术文章,在这里

原子操作CAS-最小的线程安全的更多相关文章

  1. java并发编程系列二:原子操作/CAS

    什么是原子操作 不可被中断的一个或者一系列操作 实现原子操作的方式 Java可以通过锁和循环CAS的方式实现原子操作 CAS( Compare And Swap )  为什么要有CAS? Compar ...

  2. Java并发编程(十一)——原子操作CAS

    一.原子操作 syn基于阻塞的锁的机制,1.被阻塞的线程优先级很高,2.拿到锁的线程一直不释放锁怎么办?3.大量的竞争,消耗cpu,同时带来死锁或者其他安全. CAS的原理 CAS(Compare A ...

  3. java原子操作CAS

    本次内容主要讲原子操作的概念.原子操作的实现方式.CAS的使用.原理.3大问题及其解决方案,最后还讲到了JDK中经常使用到的原子操作类. 1.什么是原子操作? 所谓原子操作是指不会被线程调度机制打断的 ...

  4. 原子操作cas

    一.概念, 基于处理器指令,把比较和交换合成一个指令完成,保证了原子性: 因为是针对一个内存地址值的,一个内存地址指向一个变量,所以只对一个共享变量能保证原子性: 二.原子操作类 锁只有synchro ...

  5. 并发之ATOMIC原子操作--CAS乐观锁原理(二)

    1.乐观锁介绍 程序完成并发操作时,访问数据时每次不加锁,假设没有冲突去完成某项操作,如果因为冲突失败就重试,直到成功为止.就是当去做某个修改或其他操作的时候它认为不会有其他线程来做同样的操作(竞争) ...

  6. hbase 原子操作cas

    在高并发的情况下,对数据row1  column=cf1:qual1, timestamp=1, value=val1的插入或者更新可能会导致非预期的情况, 例如:原本客户端A需要在value=val ...

  7. CAS 原子操作

    理会CAS和CAS: 有时候面试官面试问你的时候,会问,谈谈你对CAS的理解,这时应该有很多人,就会比较懵,当然,我也会比较懵,当然我和很多人的懵不同,很多人可能,并不知道CAS是一个什么东西,而在我 ...

  8. 【C# 线程】并发编程的基石——CAS机制

    其实Java并发框架的基石一共有两块,一块是本文介绍的CAS,另一块就是AQS,后续也会写博客介绍. 什么是CAS机制 CAS机制是一种数据更新的方式.在具体讲什么是CAS机制之前,我们先来聊下在多线 ...

  9. C++线程同步之原子操作

    所谓的原子操作就是指一个线程对于某一个资源做操作的时候能够保证没有其它的线程能够对此资源进行访问. 原子操作仅仅能够解决某一个变量的问题,只能使得一个整型数据做简单算术运算的时候是原子的. 以下案例需 ...

随机推荐

  1. 用java写的后台方法可以提供给C#调用吗?(转)

    最近和公司搞C#的同事联合搞了一个项目,我把我这边的数据加密之后传给C#,然后C#在对接收到的数据解密.可是问题来了,我这边用JAVA加密的数据C#的同事怎么也解密不出来,于是我就想到了可不可以将JA ...

  2. uwp - RichEditBox 解决设置字体样式后滚动条自动回滚顶部的问题

    原文:uwp - RichEditBox 解决设置字体样式后滚动条自动回滚顶部的问题 开发中碰到一个问题,当RichEditBox输入的文本达到一定行数的时候,滚动条此时位于底部,改变文本样式(如字体 ...

  3. HPC —— 高性能计算

    CUDA,目前只有 NVIDIA 支持: OpenCL,CUDA Tesla 卡很贵: 1. 术语及概念 SMP:"对称多处理"(Symmetrical Multi-Process ...

  4. "Redis客户端连接数一直降不下来"的有关问题解决 good

    [线上问题] "Redis客户端连接数一直降不下来"的问题解决 前段时间,上线了新的 Redis缓存(Cache)服务,准备替换掉 Memcached. 为什么要将 Memcach ...

  5. 神户制钢坑了500家企业 百年老店为何走上邪路?(企业经营再艰难,也不能降低产品质量,甚至偷工减料,同样适用于IT行业)

    神户制钢这颗烂萝卜,拔出它之后带出的泥越来越多.上周五社长川崎博也又开了记者会,再次道歉,而受到其数据造假影响的客户数量也从200家飙升到500家. 日本政府给神户制钢两周时间调查,还要在一个月内公布 ...

  6. Shell脚本入门学习笔记

    1.shell操作系统和用户之间.负责解释命令行 2./etc/shells 记录登录系统有效支持shell 3./etc/passwd 最后,有人谁可以看到用户的默认shell 4.直接输入shel ...

  7. WCF服务的IIS托管(应用程序)

    基本思路 建立与发布参考网站托管 在IIS中某一网站,选择添加应用程序   访问服务uri:http://localhost/wcfAppTest/Service1.svcwcfAppTest/Ser ...

  8. DataSet 互相转换 List

    /// <summary> /// List <-> DataSet /// </summary> public class IListDataSet { /// ...

  9. PySide——Python图形化界面入门教程(四)

    PySide——Python图形化界面入门教程(四) ——创建自己的信号槽 ——Creating Your Own Signals and Slots 翻译自:http://pythoncentral ...

  10. Android 调试桥(adb)是多种用途的工具

    Android 调试桥 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态. 可以通过下列几种方法加入adb: 在设备上运行shell命令 通过端口转发来管理 ...