`
zcmor
  • 浏览: 21356 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

AtomicInteger 浅谈

阅读更多
   众所周知,AtomicInteger,一个提供原子操作的Integer的类。在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字。而AtomicInteger则通过一种线程安全的加减操作接口。
   要使用多处理器系统的功能,通常需要使用多线程构造应用程序。但是正如任何编写并发应用程序的人可以告诉你的那样,要获得好的硬件利用率,只是简单地在多个线程中分割工作是不够的,还必须确保线程确实大部分时间都在工作,而不是在等待更多的工作,或等待锁定共享数据结构。而synchronized来控制并发就需要去等待这个锁资源,这步是非常消耗资源的,处理的吞吐量也就下去了。而java的concurrent 并发包提供的AtomicInteger就提供CAS原理避免了锁等待,具体的实现是通过UnSafe类来直接操作底层的硬件资源。
   CAS是Compare And Swap的简写。意思就是比较并交换。CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。对应到AtomicInteger的源码就是
/**
     * Atomically increments by one the current value.
     *
     * @return the previous value
     */
    public final int getAndIncrement() {
        for (;;) {
            int current = get();//使用volatile关键字修饰AtomicInteger 的value,在每次加1前都从主存中获取最新的value值。
            int next = current + 1;
            if (compareAndSet(current, next))//CAS比较并交换,如果这个current 还是原来那个,即没有其他线程修改到,那么就把加1后的新值替换以前的值。
                return current;
        }
用个for循环,就是在有其他线程改变了这个current值后不断的重试,去拿到最新的值去加1.通过这样的方式来保证线程的安全,和使用synchronized达到一样的效果。
  
    }
    下面是对加synchronized和 AtomicInteger的简单性能比较:
开3个线程,对自增操作性1000000 * 1000次。处理时间如下:
synchronized time elapse:461198
AtomicInteger time elapse:88507。
附件中有测试的代码

分享到:
评论
1 楼 lf6627926 2012-07-17  
这样的测试是否有意义呢?  先借鉴一下吧

相关推荐

    AtomicInteger并发测试

    测试java.util.concurrent.atomic.AtomicInteger的类 与直接使用int做区别

    Java中对AtomicInteger和int值在多线程下递增操作的测试

    主要介绍了Java中对AtomicInteger和int值在多线程下递增操作的测试,本文得出AtomicInteger操作 与 int操作的效率大致相差在50-80倍上下的结论,需要的朋友可以参考下

    AtomicInteger的使用,CAS的工作原理

    AtomicInteger atomicInteger = new AtomicInteger(5); atomicInteger.compareAndSet(5, 2020) + \t current data is + atomicInteger.get()) /** * Atomically sets the value to the given updated value * if ...

    Java AtomicInteger类的使用方法详解

    主要介绍了Java AtomicInteger类的使用方法详解,文中有具体实例代码,具有一定参考价值,需要的朋友可以了解下。

    Java AtomicInteger类使用方法实例讲解

    主要介绍了Java AtomicInteger类使用方法实例讲解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    java并发之AtomicInteger源码分析

    AtomicInteger是java并发包下面提供的原子类,主要操作的是int类型的整型,通过调用底层Unsafe的CAS等方法实现原子操作。下面小编和大家一起学习一下

    ViewPager+AtomicInteger实现广告轮播

    利用ViewPager实现的广告轮播,没有触摸事件的时候可以定时轮播广告,有触摸事件实施触摸事件。自动轮播使用的是线程加AtomicInteger的方式实现。

    AtomicIntegerExample:AtomicInteger示例

    AtomicInteger示例AtomicInteger用于原子增量计数器之类的应用程序。 简短的示例代码: public class AtomicIntegerExample { private final ExecutorService execService = Executors . newFixedThreadPool( 100 );...

    JAVA初级面试题(release)

    NULL 博文链接:https://it-fan.iteye.com/blog/1183175

    线程基础,线程池,生命周期

    线程基础,线程池,生命周期

    Redis数据结构与对象总结

    Redis数据结构与对象总结 数据结构与对象 简单动态字符串 SDS简介 SDS与C字符串的区别 常数复杂度获取字符串长度 O(n) O(1) 杜绝缓冲区溢出 修改字符串长度时内存重分配 空间预分配:对字符串进行增长操作时...

    java多线程自增效率比较及原理解析

    在多线程环境下,对于自增操作需要考虑线程安全问题,常见的解决方法包括使用synchronized关键字、AtomicInteger、LongAdder和LongAccumulator等。本文给出了使用这些方法实现自增的代码演示,并通过多线程测试比较...

    使用Java的Memory Model实现一个简单的计数器.txt

    这个代码实现了一个简单的计数器,使用了Java的`AtomicInteger`类来保证多线程环境下的原子性操作。`AtomicInteger`是一个支持原子操作的整数类,它内部使用了CAS(Compare And Swap)算法来实现线程安全的操作。在...

    java 分页、批量删除

    包含了jsp的简单分页,有首页、尾页、上下页、设置页面数字等,有完整的注释、包、ppt等,mysql数据库的,对后台管理的删除有不错的参考价值,非常适合web初学者,改改就可以在多少场合运用。

    用Java代码所写的简单计数器

    用Java代码所写的简单计数器,功能:根据选票人投票,最后记录数据并用立方图显示结果

    fastjson-1.2.30.zip

    增加对 android 版本序列化的 AtomicInteger/AtomicLong 支持 修改下划线或者相似属性重复时解析结果不对的问题 #1089 反序列化增强对非静态内嵌类的支持,提供更友好的出错信息 #1082 新增反序列化特性 Feature....

    Java并发编程相关源码集 包括多任务线程,线程池等.rar

     volatile关键字的非原子性、volatile关键字的使用、AtomicInteger原子性操作、线程安全小例子:多个线程竞争问题、多个线程多个锁问题、创建一个缓存的线程池、多线程使用Vector或者HashTable的示例(简单线程同步...

    kotlinx.atomicfu:在Kotlin中使用原子操作的惯用方式

    kotlinx.atomicfu:在Kotlin中使用原子操作的惯用方式

    redis-demo:spring boot高并发秒杀测试

    redis高并发秒杀测试测试项目: : 准备使用docker-compose命令启动redis服务器(可以用其他方式... //记录实际卖出的商品数量 private AtomicInteger successNum = new AtomicInteger ( 0 ); @RequestMapping ( valu

Global site tag (gtag.js) - Google Analytics