原子性 CAS算法
一、 i++ 的原子性问题
1、问题的引入:
i++ 的实际操作分为三个步骤:读--改--写
实现线程,代码如下:
public class AtomicDemo implements Runnable
{
private int serialNumber = 0; @Override
public void run()
{
try
{
Thread.sleep(400);
}
catch (InterruptedException e)
{}
System.out.println(Thread.currentThread().getName() + ": " + this.getSerialNumber());
} public int getSerialNumber()
{
return serialNumber++;
}
}
测试类,代码如下:
public class AtomicTest
{
public static void main(String[] args)
{
AtomicDemo atomicDemo = new AtomicDemo();
for (int i = 0; i < 10; i++)
{
new Thread(atomicDemo).start();
}
}
}
结果如下图所示:
以上的原子性问题可以使用“原子变量”解决;
二、原子变量
在JDK1.5 之后,提供了 java.util.concurrent.atomic 包下提供了常用的原子变量;
AtomicBoolean、AtomicInteger、AtomicIntegerArray、AtomicIntegerFieldUpdater、AtomicLong、AtomicReference 等
从以上类源码中可以看出:
(1)变量使用了 Volatile 修饰,保证了内存可见性;
(2)使用了 CAS(Compare-And-Swap)算法,保证了数据的原子性;
CAS算法是硬件对于并发操作共享数据的支持;
CAS 包含了三个操作数:内存值 、预估值 、更新值 ;
当且仅当内存值等于预估值时,把更新值赋给内存值,否则将不做任何操作;
class AtomicDemo implements Runnable
{
private AtomicInteger serialNumber = new AtomicInteger(); @Override
public void run()
{
try
{
Thread.sleep(400);
}
catch (InterruptedException e)
{}
System.out.println(Thread.currentThread().getName() + ": " + this.getSerialNumber());
} public int getSerialNumber()
{
return serialNumber.getAndIncrement();
}
}
原子性 CAS算法的更多相关文章
- 原子变量与CAS算法
原子变量 为了引出原子变量这个概念,我们先看一个例子. package com.ccfdod.juc; public class TestAtomicDemo { public static void ...
- 原子变量与CAS算法小结
CAS算法 CAS(compare-and-swap)是一种硬件对并发的支持,针对多处理器操作而设计的处理器中的一种特殊指令,用于管理对共享数据的并发访问. CAS是一种无锁非阻塞算法的实现. CAS ...
- CAS算法
/** * CAS(Compare-And-Swap)算法保证了数据的原子性 * CAS算法是硬件对于并发操作共享数据的支持 * CAS包含了3个操作数: * 内存值 V 看成两步 读取内存值为1步 ...
- juc-2-原子变量与CAS算法
i++的原子性问题 例子 int i=10; i++; 结果 i=10 分析过程 在计算机 底层 会有生成一个临时变量 tem ...
- 2.原子变量 CAS算法
前面提到,使用volatile无法保证 变量状态的原子性操作,所谓原子性,就是不可再分 如:i++的原子性问题,i++ 的操作实际上分为三个步骤 "读-改-写" (1)保存i的值 ...
- volatile关键字与内存可见性&原子变量与CAS算法
1 .volatile 关键字:当多个线程进行操作共享数据时, 可以保证内存中的数据可见 2 .原子变量:jdk1.5后java.util.concurrent.atomic 包下提供常用的原子变量 ...
- Java-JUC(三):原子性变量与CAS算法
原子性 并发程序正确地执行,必须要保证原子性.可见性以及有序性.只要有一个没有被保证,就有可能会导致程序运行不正确. 原子性:一个操作或多个操作要么全部执行完成且执行过程不被中断,要么就不执行. 可见 ...
- Compare and Swap [CAS] 算法
一个Java 5中最好的补充是对原子操作的支持类,如AtomicInteger,AtomicLong等.这些类帮助你减少复杂的(不必要的)多线程代码,实际上只是完成一些基本操作,如增加或减少多个线程之 ...
- 三、原子变量与CAS算法
原子变量:jdk1.5 后 java.util.concurrent.atomic 包下提供了常用的原子变量: - AtomicBoolean - AtomicInteger - AtomicLong ...
随机推荐
- 高分辨率下放大netbeans中的小图标
参考:http://ask.csdn.net/questions/388953 在高DPI下,Netbeans 8.2的图标变得非常小.怎么办? 修改C:\Program Files\NetBeans ...
- 将SQL for xml path('')中转义的字符正常显示
在工作中出现的发送邮件的时候:因为邮件内容中有链接,并且多个拼接在一起的,于是用了for xml path(). 但是,这样显示出来的链接时会将路径中的<,>,&符号转 ...
- 黄聪:分享几个免费IP地址查询接口(API)
淘宝IP地址库 提供的服务包括:1. 根据用户提供的IP地址,快速查询出该IP地址所在的地理信息和地理相关的信息,包括国家.省.市和运营商.2. 用户可以根据自己所在的位置和使用的IP地址更新我们的服 ...
- ORACLE procedure 一个参数分解成多个字符一点建议
测试时给什么变量就会生成什么变量, 但是在PROCEDURE时,你给的变量就会变成去掉包含字符q'/ /' 使用procedure splice添加字符串结果,是不包含q'/.删除时用的riqi赋值语 ...
- ps-如何去背景色(将背景色变透明)
由于生活或工作的需求,图片的处理是必不可少.其中将图片某一部分变为透明,或者截取图片的某一部分比较常见. 1.首先,打开待处理的图片: 2.复制背景图层,将背景图层设为不可见(左边的眼睛即可),选择左 ...
- HTTP的长连接(持久连接)和短连接
HTTP的长连接和短连接 本文总结&分享网络编程中涉及的长连接.短连接概念. 关键字:Keep-Alive,并发连接数限制,TCP,HTTP 一.什么是长连接 HTTP1.1规定了默认保持 ...
- gentoo freemind 安装设置
安装 freemind 之后,感觉菜单上面的字体比较模糊,通过设置 tools --> preference 中的 defaults --> default fonts 里面 的 defa ...
- boost安装缺少libboost_iostreams.so
编译安装boost库: 1 ./bootstrap.sh 2 ./bjam 3 ./b2 install 但安装boosth后,发现缺少libboost_iostreams.so库,后发现boost库 ...
- django session 的简单操作
#!SESSION_SAVE_EVERY_REQUEST = True 设置根据最后一次操作设置登录超时时间#!SESSION_EXPIRE_AT_BROWSER_CLOSE = True 设置是否关 ...
- mysql 使用注意
1. consider upgrading MySQL client 描述:因mysql5版本过度到8版本后,访问要求升级mysql的客户端 原因:mysql在升级后,对加密算法部分做了调整导致. 对 ...