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

JUC 原子类

    博客分类:
  • java
阅读更多

 

原文地址: http://coderbee.net/index.php/java/20131117/581

 

volatile 变量

volatile变量具有可见性,也就是说线程能够自动发现volatile 变量的最新值;对volatile变量进行操作不会造成阻塞。

适用于:多个变量之间或者某个变量的当前值与修改后值之间没有约束。

正确使用volatile变量的条件:

  1. 对变量的写操作不依赖于当前值。
  2. 该变量没有包含在具有其他变量的不变式中。

所以,volatile变量不支持像i++这样的原子操作,因为这条语句包含了三个步骤:读取-加1操作-写变量。

CAS操作

大多数CPU都提供了CAS操作指令,这条指令的作用是:对于一个变量var,如果它的当前值是excepted,则把它的值更新为newValue,否则就不更新。

由于JVM屏蔽了操作系统有关的细节,HotSpot虚拟机通过sun.misc.Unsafe类提供了这样的操作指令。

原子类

原子类是对volatile变量的增强,提供了一些稍微复杂的符合操作,如上面提到的i++操作。这里以java.util.concurrent.atomic.AtomicInteger为例。

直接读写操作

AtomicInteger有一个volatile int value属性表示对象的值,这样,对变量的读写操作就可以借助volatile语义直接完成。

public final int get() {
     return value;
}

public final void set(int newValue) {
     value = newValue;
}

CAS操作

compareAndSet是通过unsafe类的本地方法来实现的,这个方法也是实现其他复合操作的方法的基础。

public final boolean compareAndSet(int expect, int update) {
     return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}

对变量的加减操作

CPU虽然提供了CAS这样的操作指令,但并没有提供类似这样的操作:对变量加一个指定的值,再返回旧值。但AtomicInteger类却能够提供,下面就看看里面的魔法:

public final int getAndAdd(int delta) {
     for (;;) {
          int current = get(); //step 1
          int next = current + delta; //step 2
          if (compareAndSet(current, next)) //step 3
               return current;
     }
}

这个方法很简洁,在一个无穷的循环里面不断尝试这样的操作序列:先取变量的当前值,进行加操作,然后用CAS操作设置新的值,如果设置成功则返回,否则继续尝试。

这里之所以要放到一个无穷循环里进行操作,是因为step 1之后,step 3成功之前,变量的值都有可能被改变,只要变量的值被其他线程修改了,就需要重试。但只要线程之间的写竞争不激烈,这个操作序列就总会成功。

总的来说,原子类的复合操作的实现思路是:CAS + 失败后不断重试。

其他的类似操作也是采用这样的思路实现的。

ABA问题

在上面的getAndAdd方法的实现里,线程T执行step1后、执行step3之前被挂起,另一个线程T2把value属性从A修改为B,然后又修改回A,那么T恢复执行时,它是不会发现value曾经被修改,继续执行step 3是成功的。这个问题就是ABA问题。

ABA问题的解决思路是给变量的值关联一个戳记,每次修改变量的值时同时改变戳记,那么即使变量的值不变也可以发现它是否被修改过。

AtomicBoolean

这里要特别说下的是AtomicBoolean的实现。boolean只能表示true或false,只需要一个比特位就够了,但所有CPU都不直接读写某个比特位,最小的也是字节。

 

0
0
分享到:
评论

相关推荐

    java并发编程专题(十一)----(JUC原子类)数组类型详解

    Java 并发编程专题(十一)----(JUC 原子类)数组类型详解 Java 中的并发编程是指在多线程编程中,多个线程之间的协调和同步,以便实现高效、安全的并发执行。Java 提供了多种并发编程机制,其中 JUC(Java ...

    Java 多线程与并发(8-26)-JUC原子类- CAS, Unsafe和原子类详解.pdf

    Java多线程与并发处理是Java编程中的高级话题,涉及到JUC(java.util.concurrent)包中的原子类、CAS(Compare-And-Swap)机制、Unsafe类以及多线程并发的无锁方案和线程安全的实现方法。 CAS是一种无锁的同步机制...

    java并发编程专题(十)----(JUC原子类)基本类型详解

    Java并发编程专题(十)----(JUC原子类)基本类型详解 本资源主要介绍了Java JUC原子类基本类型的相关知识点,包括AtomicInteger、AtomicLong、AtomicBoolean等基本类型的使用方法和原理。通过对原子操作和 일반操作...

    Java基础笔记-8-25

    JUC原子类,ABA问题的产生和解决,以及锁的分类,JUC原子类这部分主要对其方法进行的相应的练习

    个人学习JUC代码笔记总集

    4. **原子类**:原子类如AtomicInteger、AtomicLong提供了原子操作,可以在不使用锁的情况下实现线程安全的计数或更新操作。 5. **并发工具类**: - CountDownLatch用于等待多个线程完成特定任务,常用于初始化...

    Java 多线程与并发(7-26)-JUC - 类汇总和学习指南.pdf

    Atomic 部分提供了一些原子类,例如 AtomicInteger、AtomicLong 等,这些类可以在多线程环境下安全地进行原子操作。 4.Executors: Executors 部分提供了一些线程池类,例如 ThreadPoolExecutor、...

    尚硅谷JUC视频笔记整理,很详细和全面,帮你迅速掌握JUC

    Java提供了java.util.concurrent.atomic包,它提供了一组原子类,利用无锁的CAS算法提供线程安全操作。这些类包括AtomicBoolean、AtomicInteger、AtomicLong等,它们可以保证对单个变量的操作是原子的,但不保证多个...

    JUC–Atomic原子类

    Java并发编程领域中的一个重要工具是`java.util.concurrent.atomic`包,这个包中包含了一系列的原子类,它们提供了无锁线程安全的编程机制。原子类的设计目标是在多线程环境下,对变量的操作能够像单线程环境一样,...

    尚硅谷Java视频_JUC 视频教程

    尚硅谷_JUC线程高级_原子变量与 CAS 算法 ·3. 尚硅谷_JUC线程高级_模拟 CAS 算法 ·4. 尚硅谷_JUC线程高级_同步容器类ConcurrentHashMap ·5. 尚硅谷_JUC线程高级_CountDownLatch 闭锁 ·6. 实现 Callable 接口 ·...

    JUC包含线程,线程池,CAS,volatile等底层原理,以及相关问题的解决方式以及相关工具类的使用

    Java并发编程领域中,JUC(Java Concurrency Utility)库扮演着至关重要的角色,它提供了高效、安全的多线程编程工具。JUC包括线程、线程池、CAS(Compare and Swap)操作、volatile关键字以及其他相关的底层原理和...

    Java——JUC

    JUC主要包含在`java.util.concurrent`包中,提供了线程池、同步容器、并发集合、原子类、异步计算以及定时任务等多种高级并发工具。 1. **线程池(ExecutorService)** - 线程池是JUC中的核心组件,它允许开发者...

    JUC线程锁框架

    JUC提供了一系列的原子变量类,如AtomicInteger、AtomicLong等,它们实现了在无同步的情况下进行原子操作,确保在多线程环境下数据的一致性。这些类通过CAS(Compare and Swap)算法实现,能够在高并发场景下高效地...

    juc源码视频教程最全

    4. **原子变量**:Atomic包下的Integer、Long、Boolean等原子类提供了无锁的原子操作,如自增、自减等,确保了并发环境下的数据一致性。 5. **并发工具类**:CountDownLatch、CyclicBarrier、Semaphore等工具类用于...

    JUC代码收集,java高并发多线程学习

    2. **atomic**:这个包包含了一系列原子类,如`AtomicInteger`, `AtomicLong`等,它们提供了在不使用锁的情况下进行原子操作的能力,提高了并发性能。 3. **locks**:此包提供了高级锁定机制,如`ReentrantLock`和`...

    尚硅谷Java视频_JUC视频教程

    - **Atomic类**: `java.util.concurrent.atomic`包下的原子类提供了基本类型的原子更新操作,如`AtomicInteger`等。它们在无锁的情况下实现多线程环境中的原子操作。 - **ConcurrentHashMap**: 一种线程安全的哈希...

    狂神说JUC代码狂神说JUC代码

    5. **原子类**:如AtomicInteger、AtomicLong等,它们提供了一种无锁的原子操作,能够在多线程环境下实现高效的更新操作。 6. **CountDownLatch**:计数器,用于等待一组线程完成任务。计数值为0时,所有等待的线程...

    JUC并发编程与源码分析视频课.zip

    7. **原子类与CAS操作**:介绍AtomicInteger、AtomicLong等原子类,以及无锁编程的基础——Compare and Swap(CAS)操作。理解无锁数据结构的实现和优势。 8. **线程局部变量**:学习ThreadLocal类的使用,了解如何...

    尚硅谷JUC百度云连接

    4. **原子变量**:如`AtomicInteger`、`AtomicLong`等,这些类提供了一种无需显式加锁即可实现线程安全的方式。 5. **阻塞队列**:如`ArrayBlockingQueue`、`LinkedBlockingQueue`等,它们是线程安全的队列,通常用...

    JUC核心类AQS的底层原理

    AQS作为Java并发工具包(JUC)中的一个核心抽象类,其设计目的是为了实现各种同步器(如锁、信号量等)。AQS主要通过三个核心组成部分来实现这些同步组件的功能: 1. **State变量及其CAS操作**:AQS维护了一个名为`...

Global site tag (gtag.js) - Google Analytics