`

AtomicInteger的并发处理

 
阅读更多

JDK1.5之后的java.util.concurrent.atomic包里,多了一批原子处理类。主要用于在高并发环境下的高效程序处理。

网上关于这个原理介绍的比较靠谱的一片文章是出自IBM工程师的一篇:

流行的原子

 

值得一看。

这里,我们来看看AtomicInteger是如何使用非阻塞算法来实现并发控制的。

AtomicInteger的关键域只有一下3个:

 

    // setup to use Unsafe.compareAndSwapInt for updates
    private static final Unsafe unsafe = Unsafe.getUnsafe();
    private static final long valueOffset;
    private volatile int value;

 这里, unsafe是java提供的获得对对象内存地址访问的类,注释已经清楚的写出了,它的作用就是在更新操作时提供“比较并替换”的作用。实际上就是AtomicInteger中的一个工具。

valueOffset是用来记录value本身在内存的便宜地址的,这个记录,也主要是为了在更新操作在内存中找到value的位置,方便比较。

注意:value是用来存储整数的时间变量,这里被声明为volatile,就是为了保证在更新操作时,当前线程可以拿到value最新的值(并发环境下,value可能已经被其他线程更新了)。

这里,我们以自增的代码为例,可以看到这个并发控制的核心算法:

 

    /**
     * Atomically increments by one the current value.
     *
     * @return the updated value
     */
    public final int incrementAndGet() {
        for (;;) {
            //这里可以拿到value的最新值
            int current = get();
            int next = current + 1;
            if (compareAndSet(current, next))
                return next;
        }
    }

    public final boolean compareAndSet(int expect, int update) {
        //使用unsafe的native方法,实现高效的硬件级别CAS
	return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
    }

 好了,看到这个代码,基本上就看到这个类的核心了。相对来说,其实这个类还是比较简单的。

看到网上一些资料对这个类的一些问题,这里简要摘录几个关键的,尝试解答一下:

1、为什么AtomicInteger里面的compareAndSet和weakCompareAndSet方法实现完全一样,注释说明却不同?

这个问题,一个老外的回答比较靠谱,这里给出链接:the difference between compareAndSet and weakCompareAndSet 。核心观点就是人家保留更改这个实现的权利。现在一样可能是暂时的,将来可能会不一样,所以使用接口时,还是按照人家接口说明来吧。

2、他比直接使用传统的java锁机制(阻塞的)有什么好处?

最大的好处就是可以避免多线程的优先级倒置和死锁情况的发生,当然高并发下的性能提升也是很重要的。

3、使用了他,并发环境下就一定没问题了吗?

这个还真未必!这个在上面那篇《流行的原子》文章中也提到了的ABA问题。在某些场景下,可能会造成业务问题。但是多数的场景(比如高效的计数器实现)是不用担心这个问题的。

 

分享到:
评论

相关推荐

    AtomicInteger 浅谈

    例如,在一个高并发的Web服务器中,我们可以使用AtomicInteger来记录请求的计数,从而统计处理了多少个请求。 下面是一个简单的示例,展示了如何使用AtomicInteger: ```java import java.util.concurrent.atomic....

    java并发编程实战源码,java并发编程实战pdf,Java

    6. **原子操作与CAS**:AtomicInteger、AtomicLong等原子类利用了硬件级别的CAS(Compare and Swap)操作,实现了无锁编程,提高了并发性能。 7. **死锁、活锁与饥饿**:并发编程中常见的问题,需要理解和避免这些...

    (PDF带目录)《Java 并发编程实战》,java并发实战,并发

    8. **并发异常处理**:在并发环境下,异常处理变得更为复杂,书中有专门章节讲解如何正确捕获和处理线程间的异常。 9. **线程通信**:`wait()`, `notify()`和`notifyAll()`方法是Java中基本的线程通信手段,书中会...

    java并发编程艺术

    此外,书中可能还会涉及其他并发编程相关的高级话题,比如原子变量(`AtomicInteger`, `AtomicReference`等)、并发工具类(如`CountDownLatch`, `CyclicBarrier`, `Semaphore`)以及Fork/Join框架。这些工具可以...

    Java 并发编程实战.pdf

    - **并发数据处理**:利用Stream API结合并行流处理大量数据集,提高数据处理效率。 通过上述内容的学习,开发者不仅能掌握Java并发编程的基本原理和技术要点,还能学会如何将这些理论应用于实际工作中,解决复杂的...

    java并发编程与高并发解决方案

    在探讨Java并发编程与高并发解决方案之前,我们首先需要理解几个关键概念:并发(Concurrency)、高并发(High ...此外,随着云计算和微服务架构的发展,如何在分布式环境下实现高并发处理也成为了当前研究的热点之一。

    java并发编程2

    - **并发** 指的是多个任务在同一时间段内被处理,而不是顺序执行。在Java中,这通常通过创建和管理线程来实现。 2. **Java并发工具** - **`java.util.concurrent` 包** 提供了丰富的并发工具类,如`...

    多线程并发技术

    例如,LongAdder是一个线程安全的累加器,它在高并发的情况下,相比于传统的AtomicInteger提供了更高的性能。这是因为LongAdder在内部使用了分段数组来分散热点,从而减少了高并发下的竞争程度。此外,...

    Java并发编程设计原则和模式

    本资料“Java并发编程设计原则和模式”深入探讨了如何在Java环境中有效地进行并发处理,以充分利用系统资源并避免潜在的并发问题。 一、并发编程基础 并发是指两个或多个操作在同一时间段内执行,但并不意味着这些...

    java 高并发解决 思路

    在Java编程领域,高并发处理是一项至关重要的技术,特别是在构建大型、高性能的互联网应用时。本文将基于"java 高并发解决思路"这一主题,深入探讨相关知识点,并结合"高并发web架构.pdf"文档中的实例进行阐述。 1....

    JAVA并发编程实践 EN(全)

    在Java编程中,并发处理是现代多核处理器环境下软件设计的关键部分,它涉及到如何有效地利用系统资源,提高程序执行效率,同时避免并行执行时可能出现的问题。 本书主要涵盖以下几个核心知识点: 1. **并发基础**...

    java并发编程电子书

    - 在并发环境中,异常处理显得尤为重要,合理的异常处理机制可以防止程序因未捕获异常而崩溃。 9. **并发调试与监控** - 使用`jconsole`、`VisualVM`等工具进行并发程序的监控和分析,找出潜在的性能瓶颈和并发...

    java并发编程书籍

    8. **原子操作类**:`java.util.concurrent.atomic`包下的原子类如`AtomicInteger`、`AtomicReference`等,提供了一种无锁编程的方式,通过CAS(Compare and Swap)操作来更新变量,保证了操作的原子性。 9. **死锁...

    Java高并发程序设计模式资料

    10. **分布式并发**:在大型系统中,分布式锁、分布式计数器、分布式队列等技术是高并发处理的常见手段,例如Redis和Zookeeper等中间件提供的服务。 11. **设计模式在并发中的应用**:比如单例模式的线程安全实现,...

    Java并发编程实践.pdf

    Java并发工具包中提供了原子类,如AtomicInteger、AtomicLong等,它们可以实现对整型或长整型变量的原子操作,无需显式加锁即可保证线程安全。 ##### 3.2 阻塞队列 阻塞队列(BlockingQueue)是Java并发工具包中的...

    Java 并发核心编程

    自Java诞生之初,其设计者就赋予了该语言强大的并发处理能力。Java语言内置了对线程和锁的支持,这使得开发者能够轻松地编写多线程应用程序。本文旨在帮助Java开发者深入理解并发的核心概念,并掌握如何有效地运用...

    并发编程的艺术

    JMM规定了 volatile、synchronized 和 final 关键字的行为,帮助开发者编写正确处理并发的代码。 2. **线程**:Java中的Thread类是实现并发的基础。创建线程、启动线程、线程的生命周期(新建、就绪、运行、阻塞、...

    java并发编程库

    Java并发编程库,特别是java.util.concurrent(简称J.U.C),是Java语言在多线程处理上的一大亮点。并发编程是一个复杂的话题,因为它涉及到许多高级概念,包括线程安全、死锁、性能优化和原子操作等。J.U.C正是为了...

    实战java高并发编程

    在Java编程中,高并发处理是性能优化和系统稳定性的重要组成部分,尤其在大数据处理、分布式系统以及云计算等场景下,其重要性不言而喻。 本书首先会深入讲解Java并发的基础概念,包括线程的创建与管理,线程同步...

Global site tag (gtag.js) - Google Analytics