`
zcmor
  • 浏览: 21779 次
  • 性别: 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类使用方法实例讲解

    Java AtomicInteger类使用方法实例讲解 Java AtomicInteger类是Java语言中的一种高效的原子操作类,主要用于在高并发环境下的高效程序处理。AtomicInteger类提供了一种线程安全的加减操作接口,能够帮助开发者简化...

    Java AtomicInteger类的使用方法详解

    Java AtomicInteger类的使用方法详解 Java AtomicInteger类是Java中提供的一种原子操作的Integer类,通过线程安全的方式操作加减。它可以在高并发情况下使用,提供原子操作来进行Integer的使用。 Atomicinteger类...

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

    为了确保数据在并发访问时的正确性,Java提供了一系列的原子类,包括`AtomicInteger`,它为整数类型的变量提供了线程安全的更新操作。这个话题将深入探讨`AtomicInteger`与普通`int`变量在多线程环境下进行递增操作...

    Java中的原子操作:深入探索AtomicInteger的实现与应用

    在Java的并发编程中,AtomicInteger 是一个非常重要的原子类,它提供了一种无锁的机制来保证整数操作的原子性。本文将详细介绍 AtomicInteger 的工作原理、使用方法以及如何在实际项目中应用它。 AtomicInteger 是...

    java并发之AtomicInteger源码分析

    Java并发之AtomicInteger源码分析 AtomicInteger是Java并发包下面提供的原子类,主要操作的是int类型的整型,通过调用底层Unsafe的CAS等方法实现原子操作。下面是对AtomicInteger的源码分析。 1. 什么是原子操作...

    ViewPager+AtomicInteger实现广告轮播

    本项目通过结合ViewPager和AtomicInteger实现了一个高效的广告轮播功能,具有自动轮播和响应用户触摸事件的能力。 首先,`ViewPager`是Android SDK提供的一种强大的组件,主要用于展示可滑动的页面集合。在这个案例...

    浅谈Java的多线程机制.pdf

    ### 浅谈Java的多线程机制 #### 一、引言 随着计算机技术的不断发展,编程模型变得越来越复杂和多样化。多线程编程模型作为目前计算机系统架构中的一个重要组成部分,其重要性日益凸显。特别是在X86架构的硬件成为...

    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 ...

    AtomicIntegerExample:AtomicInteger示例

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

    浅谈Java并发编程之Lock锁和条件变量

    "浅谈Java并发编程之Lock锁和条件变量" Lock锁是Java并发编程中的一种重要机制,它提供了比synchronized更加广泛的锁定操作。Lock接口有三种实现类:ReentrantLock、ReetrantReadWriteLock.ReadLock和...

    浅谈Java 并发的底层实现

    `AtomicInteger` 的 `getAndIncrement()` 方法就是一个例子,它在底层利用了 `sun.misc.Unsafe` 类,这是一个Java对C++风格的内存操作的封装。`Unsafe` 类提供了原子操作的实现,例如CAS(Compare and Swap)操作,...

    JAVA初级面试题(release)

    【JAVA初级面试题(release)】相关知识点详解 在Java初级面试中,考察的知识点广泛且基础,旨在评估应聘者对编程语言基本概念的理解以及实际编程能力。以下是一些核心的Java基础知识,这些内容通常会出现在笔试题...

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

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

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

    通过使用`AtomicInteger`实现的简单计数器示例,我们可以看到,在多线程环境下,利用`AtomicInteger`能够有效地保证数据操作的原子性和线程安全性。这对于开发高性能、高并发的应用程序来说是非常重要的。此外,通过...

    Redis数据结构与对象总结

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

    深入浅出Java_Concurrency

    ### 深入浅出Java_Concurrency #### J.U.C的整体认识 Java的并发编程模型在J.U.C(`java.util.concurrent`)包中得到了全面的展现,这不仅仅是Java语言本身的一大亮点,更是多线程编程领域的重要组成部分。本文...

    java 分页、批量删除

    Java 分页和批量删除是Web开发中的两个重要概念,尤其在大数据量的后台管理系统中,它们对于提升用户体验和优化数据库操作至关重要。以下是对这两个主题的详细讲解。 **分页** 分页是网页显示大量数据时常用的一种...

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

    在本文中,我们将深入探讨如何使用Java编程语言创建一个简单的计数器应用,该应用能够处理投票过程,并最终以立方图的形式展示结果。... 首先,让我们从Java代码的基础结构开始。在提供的文件"Cal.java"中,我们可能...

Global site tag (gtag.js) - Google Analytics