一、 i++ 的原子性问题

1、问题的引入:

i++ 的实际操作分为三个步骤:读--改--写

实现线程,代码如下:

  1. public class AtomicDemo implements Runnable
  2. {
  3. private int serialNumber = 0;
  4.  
  5. @Override
  6. public void run()
  7. {
  8. try
  9. {
  10. Thread.sleep(400);
  11. }
  12. catch (InterruptedException e)
  13. {}
  14. System.out.println(Thread.currentThread().getName() + ": " + this.getSerialNumber());
  15. }
  16.  
  17. public int getSerialNumber()
  18. {
  19. return serialNumber++;
  20. }
  21. }

测试类,代码如下:

  1. public class AtomicTest
  2. {
  3. public static void main(String[] args)
  4. {
  5. AtomicDemo atomicDemo = new AtomicDemo();
  6. for (int i = 0; i < 10; i++)
  7. {
  8. new Thread(atomicDemo).start();
  9. }
  10. }
  11. }

结果如下图所示:

以上的原子性问题可以使用“原子变量”解决;

二、原子变量

在JDK1.5 之后,提供了 java.util.concurrent.atomic 包下提供了常用的原子变量;

AtomicBoolean、AtomicInteger、AtomicIntegerArray、AtomicIntegerFieldUpdater、AtomicLong、AtomicReference 等

从以上类源码中可以看出:

  (1)变量使用了 Volatile 修饰,保证了内存可见性;

  (2)使用了 CAS(Compare-And-Swap)算法,保证了数据的原子性;

  CAS算法是硬件对于并发操作共享数据的支持;

  CAS 包含了三个操作数:内存值 、预估值 、更新值 ;

    当且仅当内存值等于预估值时,把更新值赋给内存值,否则将不做任何操作;

  1. class AtomicDemo implements Runnable
  2. {
  3. private AtomicInteger serialNumber = new AtomicInteger();
  4.  
  5. @Override
  6. public void run()
  7. {
  8. try
  9. {
  10. Thread.sleep(400);
  11. }
  12. catch (InterruptedException e)
  13. {}
  14. System.out.println(Thread.currentThread().getName() + ": " + this.getSerialNumber());
  15. }
  16.  
  17. public int getSerialNumber()
  18. {
  19. return serialNumber.getAndIncrement();
  20. }
  21. }

原子性 CAS算法的更多相关文章

  1. 原子变量与CAS算法

    原子变量 为了引出原子变量这个概念,我们先看一个例子. package com.ccfdod.juc; public class TestAtomicDemo { public static void ...

  2. 原子变量与CAS算法小结

    CAS算法 CAS(compare-and-swap)是一种硬件对并发的支持,针对多处理器操作而设计的处理器中的一种特殊指令,用于管理对共享数据的并发访问. CAS是一种无锁非阻塞算法的实现. CAS ...

  3. CAS算法

    /** * CAS(Compare-And-Swap)算法保证了数据的原子性 * CAS算法是硬件对于并发操作共享数据的支持 * CAS包含了3个操作数: * 内存值 V 看成两步 读取内存值为1步 ...

  4. juc-2-原子变量与CAS算法

      i++的原子性问题 例子   int i=10;           i++; 结果   i=10   分析过程                    在计算机 底层 会有生成一个临时变量 tem ...

  5. 2.原子变量 CAS算法

    前面提到,使用volatile无法保证 变量状态的原子性操作,所谓原子性,就是不可再分 如:i++的原子性问题,i++ 的操作实际上分为三个步骤  "读-改-写" (1)保存i的值 ...

  6. volatile关键字与内存可见性&原子变量与CAS算法

    1 .volatile 关键字:当多个线程进行操作共享数据时, 可以保证内存中的数据可见 2 .原子变量:jdk1.5后java.util.concurrent.atomic 包下提供常用的原子变量 ...

  7. Java-JUC(三):原子性变量与CAS算法

    原子性 并发程序正确地执行,必须要保证原子性.可见性以及有序性.只要有一个没有被保证,就有可能会导致程序运行不正确. 原子性:一个操作或多个操作要么全部执行完成且执行过程不被中断,要么就不执行. 可见 ...

  8. Compare and Swap [CAS] 算法

    一个Java 5中最好的补充是对原子操作的支持类,如AtomicInteger,AtomicLong等.这些类帮助你减少复杂的(不必要的)多线程代码,实际上只是完成一些基本操作,如增加或减少多个线程之 ...

  9. 三、原子变量与CAS算法

    原子变量:jdk1.5 后 java.util.concurrent.atomic 包下提供了常用的原子变量: - AtomicBoolean - AtomicInteger - AtomicLong ...

随机推荐

  1. VDMA时序分析

    VDMA时序分析

  2. Delphi LiveBinds组件

    Component Logo Component Name Description TBindSourceDB Is used for creating bindings to databases. ...

  3. Excel函数之sumifs应用

    这个函数是用来进行多条件求和的一个函数 示例:根据表格求出“鼎盛书店”2012年度所有图书小计的总和,这里就用sumifs计算 首先定位结果输出单元格,祭出函数. sum_range参数就是筛选后需要 ...

  4. 【OpenStack】network相关知识学习

    network 类型 local:通信不跨主机,必须同一网段,主要做单机测试使用: flat:统计可以跨主机,但是需要在同一网段: 每个 flat network 都会独占一个物理网卡 计算节点上 b ...

  5. 读取Excel的部分问题

    1.office分很多版本,导致Excel连接字符串不同. 2.是否有标题头的问题(在连接字符串中设置) 3.Excel本身删除分数据删除和表格结构删除.普通delete只能删除数据, 还是能读取到表 ...

  6. Dapper/SqlMapper映射对应问题

    Dapper, a light weight object mapper for ADO.NET 轻量级orm辅助类,不用配置,直接引入一个cs文件或者引入其dll就能使用. 使用连接对象的query ...

  7. storj白皮书v3最全面解读,Docker创始人的加入能否扳倒AWS S3

    Storj新发了白皮书v3,地址是:https://storj.io/storjv3.pdf. 这次白皮书一共有90页,看完还真要费不少时间.如果你没有时间看,可以看一下我这篇快速技术解读. 上次St ...

  8. C# 语言历史版本特性(C# 1.0到C# 7.1汇总更新)

    历史版本C#作为微软2000年以后.NET平台开发的当家语言,发展至今具有17年的历史,语言本身具有丰富的特性,微软对其更新支持也十分支持.微软将C#提交给标准组织ECMA,C# 5.0目前是ECMA ...

  9. 使用jquery+css实现瀑布流布局

    虽然可以直接使用css实现瀑布流布局,但显示的方式有点问题,所以这儿就直接使用jquery+css来实现瀑布流布局,最终效果如下:      思路是通过将每个小块的position设置为relativ ...

  10. shell脚本(一)

     shell脚本(一) 定义:脚本就是一条条命令的堆积.常见脚本有:js asp,jsp,php,python Shell特点:简单易用高效 Shell分类:图形界面(gui shell) 命令行界面 ...