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问题。在某些场景下,可能会造成业务问题。但是多数的场景(比如高效的计数器实现)是不用担心这个问题的。
分享到:
相关推荐
例如,在一个高并发的Web服务器中,我们可以使用AtomicInteger来记录请求的计数,从而统计处理了多少个请求。 下面是一个简单的示例,展示了如何使用AtomicInteger: ```java import java.util.concurrent.atomic....
Java高并发编程是Java开发中的重要领域,尤其在大规模分布式系统和互联网应用中,对高并发处理能力的要求日益提升。本资源包含了一套完整的Java高并发视频教学,以及相关的实战项目和面试题目,旨在帮助开发者深入...
7. **并发异常处理**:在并发编程中,正确处理异常是非常重要的,书中会讲解如何在多线程环境中优雅地处理异常。 8. **JVM内存模型与并发**:JVM内存模型对并发编程有直接影响,书中会阐述Java内存模型(JMM)的...
6. **原子操作与CAS**:AtomicInteger、AtomicLong等原子类利用了硬件级别的CAS(Compare and Swap)操作,实现了无锁编程,提高了并发性能。 7. **死锁、活锁与饥饿**:并发编程中常见的问题,需要理解和避免这些...
8. **并发异常处理**:在并发环境下,异常处理变得更为复杂,书中有专门章节讲解如何正确捕获和处理线程间的异常。 9. **线程通信**:`wait()`, `notify()`和`notifyAll()`方法是Java中基本的线程通信手段,书中会...
- **并发数据处理**:利用Stream API结合并行流处理大量数据集,提高数据处理效率。 通过上述内容的学习,开发者不仅能掌握Java并发编程的基本原理和技术要点,还能学会如何将这些理论应用于实际工作中,解决复杂的...
此外,书中可能还会涉及其他并发编程相关的高级话题,比如原子变量(`AtomicInteger`, `AtomicReference`等)、并发工具类(如`CountDownLatch`, `CyclicBarrier`, `Semaphore`)以及Fork/Join框架。这些工具可以...
在探讨Java并发编程与高并发解决方案之前,我们首先需要理解几个关键概念:并发(Concurrency)、高并发(High ...此外,随着云计算和微服务架构的发展,如何在分布式环境下实现高并发处理也成为了当前研究的热点之一。
- **并发** 指的是多个任务在同一时间段内被处理,而不是顺序执行。在Java中,这通常通过创建和管理线程来实现。 2. **Java并发工具** - **`java.util.concurrent` 包** 提供了丰富的并发工具类,如`...
ConcurrentHashMap则是一种线程安全的哈希映射,它使用分段锁策略提高了并发性能,相比传统的synchronized HashMap有着更高的并发处理能力。 书中可能还会涉及线程池的使用,Java的Executor框架允许我们创建和管理...
例如,LongAdder是一个线程安全的累加器,它在高并发的情况下,相比于传统的AtomicInteger提供了更高的性能。这是因为LongAdder在内部使用了分段数组来分散热点,从而减少了高并发下的竞争程度。此外,...
本资料“Java并发编程设计原则和模式”深入探讨了如何在Java环境中有效地进行并发处理,以充分利用系统资源并避免潜在的并发问题。 一、并发编程基础 并发是指两个或多个操作在同一时间段内执行,但并不意味着这些...
在Java编程领域,高并发处理是一项至关重要的技术,特别是在构建大型、高性能的互联网应用时。本文将基于"java 高并发解决思路"这一主题,深入探讨相关知识点,并结合"高并发web架构.pdf"文档中的实例进行阐述。 1....
在Java编程中,并发处理是现代多核处理器环境下软件设计的关键部分,它涉及到如何有效地利用系统资源,提高程序执行效率,同时避免并行执行时可能出现的问题。 本书主要涵盖以下几个核心知识点: 1. **并发基础**...
8. **并发异常处理**:线程间的异常处理是并发编程中的一个挑战,理解如何捕获和传播线程异常,以及如何优雅地停止线程是必要的。 9. **Java内存模型(JMM)**:理解JMM对于理解并发编程中的可见性、有序性和一致性...
- 在并发环境中,异常处理显得尤为重要,合理的异常处理机制可以防止程序因未捕获异常而崩溃。 9. **并发调试与监控** - 使用`jconsole`、`VisualVM`等工具进行并发程序的监控和分析,找出潜在的性能瓶颈和并发...
8. **原子操作类**:`java.util.concurrent.atomic`包下的原子类如`AtomicInteger`、`AtomicReference`等,提供了一种无锁编程的方式,通过CAS(Compare and Swap)操作来更新变量,保证了操作的原子性。 9. **死锁...
这本书详细阐述了在Java平台中进行高效并发处理的关键概念、设计原则和实用模式。以下是对该书内容的一些核心知识点的概述: 1. **线程基础**:书中首先介绍了Java中的线程模型,包括如何创建线程(通过Thread类或...
10. **分布式并发**:在大型系统中,分布式锁、分布式计数器、分布式队列等技术是高并发处理的常见手段,例如Redis和Zookeeper等中间件提供的服务。 11. **设计模式在并发中的应用**:比如单例模式的线程安全实现,...