博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
i++的原子性问题
阅读量:5883 次
发布时间:2019-06-19

本文共 1657 字,大约阅读时间需要 5 分钟。

一、什么是原子性

  简单的可以理解为:操作是不可再分割的,比如;

int i=0;

但是i++的操作是可以再分的,比如:

i++ //分解后i=i+i

上面的代码在多线程环境下取值是有问题的,比如:

package com.example.demo.juc;/** * @author DUCHONG * @since 2019-01-07 19:11 **/public class AtomicTest {    public static void main(String[] args) {        AtomicThread atomicTest=new AtomicThread();        for (int i=1;i<=20;i++){            new Thread(atomicTest).start();        }    }}class AtomicThread implements Runnable {    private  int num=1;    @Override    public void run() {        try {            Thread.sleep(300);            System.out.println(getNum());        } catch (InterruptedException e) {            e.printStackTrace();        }    }    public int getNum(){        return num++;    }}

结果:

这种问题当然可以通过加synchronized 关键字来解决,那有没有另外一种方案呢,答案肯定是有的,且在jdk1.5的时候就有了,那就是Atomic包下的原子类

优化后:

package com.example.demo.juc;import java.util.concurrent.atomic.AtomicInteger;/** * @author DUCHONG * @since 2019-01-07 19:11 **/public class AtomicTest {    public static void main(String[] args) {        AtomicThread atomicTest=new AtomicThread();        for (int i=1;i<=20;i++){            new Thread(atomicTest).start();        }    }}class AtomicThread implements Runnable {    private AtomicInteger at=new AtomicInteger(1);    @Override    public void run() {        try {            Thread.sleep(300);            System.out.println(getNum());        } catch (InterruptedException e) {            e.printStackTrace();        }    }    public int getNum(){        return at.getAndIncrement();    }}

看源码:

构造函数中的值,是volatile类型的

自增或者自减时,使用了CAS算法,CAS算法有三个操作数:

内存值:A

预估值:B

新值:V 

当且仅当 A=B 是 A=V 

否则不做任何操作。

转载于:https://www.cnblogs.com/geekdc/p/10235283.html

你可能感兴趣的文章
IE8 中 session 管理的变化
查看>>
学习Unix怎么安装机器?《精通Unix下C语言与项目实践》读书笔记(14)
查看>>
《从零开始学Swift》学习笔记(Day 21)——函数返回值
查看>>
AD的备份与标准还原:深入浅出Active Directory系列(四)
查看>>
编译可在Android上运行的可执行文件:C/C++交叉编译环境
查看>>
To ADO.NET Entity Framework
查看>>
运用Ntop监控网络流量(视频Demo)
查看>>
SCOM 2007 R2监控系统安装部署(四)使用SCOM 2007 R2监控AD域控制器
查看>>
linux下将数字补齐为固定宽度的方式
查看>>
探讨微软团队开发利器VSTS联合MS PROJECT协同开发
查看>>
安全运维之:网络实时流量监测工具iftop
查看>>
跟我学交换机配置(六)
查看>>
原创:检查点的三种加入方式
查看>>
图形界面备份Linux系统介绍
查看>>
SQLServer性能优化之查询提示
查看>>
企业建立规范化IT运维管理制度的重要性
查看>>
CCNA(Stand-ALONE)Lab 14-Troubleshooting RIP
查看>>
oc51--循环retain
查看>>
Java基本数据类型与位运算
查看>>
欣赏ActionScript 3 的元件架构
查看>>