`
Terry_zzz
  • 浏览: 6599 次
  • 性别: Icon_minigender_1
  • 来自: 大连
最近访客 更多访客>>
社区版块
存档分类
最新评论

Atomic包中AtomicInteger原子类型学习

    博客分类:
  • JAVA
阅读更多
AtomicInteger,一个提供原子操作的Integer的类。在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字。
来看AtomicInteger提供的接口。

//获取当前的值

public final int get()

//取当前的值,并设置新的值

public final int getAndSet(int newValue)

//获取当前的值,并自增

public final int getAndIncrement()

//获取当前的值,并自减

public final int getAndDecrement()

//获取当前的值,并加上预期的值

public final int getAndAdd(int delta)

... ...

getAndSet:设置为新值,返回设置之前的值。此方法为原子性操作,即保证在得到当前值与设置新值之间,没有任何其他更新操作。
01.public final int getAndSet(int newValue) {  
02.        for (;;) {  
03.            int current = get();  
04.            if (compareAndSet(current, newValue))  
05.                return current;  
06.        }  
07.    }  


getAndIncrement:当前值加一,返回自增前的值。此方法为原子性操作,即保证在得到当前值与自增之间,没有任何其他更新操作。举个例子,假如是value++,两个线程同时调用此函数,两个线程都取到了当前值100,然后都基于100加一,最后得到101,miss掉了一次自增。采用compareAndSet,两个线程同时取到当前值100,线程一成功调用compareAndSet,当前值变为101,返回;线程二调用compareAndSet失败,回到循环头,重新取得一个新的当前值101,接着成功调用comareAndSet,更新当前值为102,返回

01.public final int getAndIncrement() {  
02.        for (;;) {  
03.            int current = get();  
04.            int next = current + 1;  
05.           if (compareAndSet(current, next))  
06.                return current;  
07.        }  
08.nbsp;}  


compareAndSet:如果当前值与期望值(第一个参数)相等,则设置为新值(第二个参数),设置成功返回true。

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


compareAndSet:如果当前值与期望值相等,更新对象的一个整数属性(field)为给定的值。更新则返回true,否则为false。此方法为原子性操作,而且是native方法。

01.public native boolean compareAndSwapInt(Object obj, long offset,  
02.                                        int expect, int update); 
分享到:
评论

相关推荐

    15 原子性轻量级实现—深入理解Atomic与CAS.pdf

    `Atomic`类位于`java.util.concurrent.atomic`包中,包括如`AtomicInteger`、`AtomicLong`、`AtomicBoolean`等,分别对应不同类型的原子变量。它们提供了线程安全的更新操作,例如`incrementAndGet()`方法,能够在多...

    java多线程中的原子操作

    总结来说,Java多线程中的原子操作是保证并发安全的重要手段,通过使用`java.util.concurrent.atomic`包中的原子类,开发者可以编写出高效且线程安全的代码。同时,自定义的数据结构和工具类如CircularSet和...

    Java线程同步与 Java 并发设施.pdf

    java.util.concurrent.atomic包中的原子类,如AtomicInteger、AtomicLong等,使用了硬件级别的CAS(Compare and Swap)指令来实现无锁编程。虽然CAS操作不会导致线程阻塞,但它们仍然具有一定的开销,因为它们需要...

    JUC–Atomic原子类

    `AtomicInteger`是`java.util.concurrent.atomic`包中的一个核心类,它代表了一个可以进行原子操作的int类型变量。这个类不仅提供了基础的get和set方法,这两个方法具有与volatile变量相同内存语义,保证了在多线程...

    并发编程atomic&collections-课上笔记1

    AtomicInteger 类是一个原子整数类型,提供了 incrementAndGet、decrementAndGet、addAndGet 等方法,用于原子地更新整数值。例如,incrementAndGet 方法可以原子地将整数值增加 1。 CAS 算法的原理 --------------...

    Java并发编程包中atomic的实现原理示例详解

    AtomicInteger是Java并发编程包中的一种 atomic 变量,主要用于解决多线程中数据同步的问题。AtomicInteger的实现原理是通过使用volatile关键字保证可见性,并使用CAS(Compare-And-Swap)乐观锁来保证原子性。CAS...

    Java并发编程实践

    Java提供了多种同步机制,如synchronized关键字、volatile变量、java.util.concurrent包中的Lock接口(如ReentrantLock)以及java.util.concurrent.atomic包中的原子类。synchronized提供了互斥访问,确保同一时间...

    3 JMM内存模型.md,学习代码

    而 atomic 包中的类,如 AtomicInteger 和 AtomicLong,提供了一种在无锁情况下实现原子操作的方法。 有序性通过 volatile 和 synchronized 关键字以及 happens-before 规则来保证。happens-before 是JMM中的一组...

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

    `AtomicInteger`是Java `util.concurrent.atomic`包中的一个类,它提供了一种无锁的、线程安全的整数操作方式。在多线程环境中,当多个线程同时尝试修改一个`AtomicInteger`实例的值时,`AtomicInteger`会确保这些...

    java线程-Atomic的含义及示例_.docx

    1. **基本类型**:包括`AtomicBoolean`、`AtomicInteger`和`AtomicLong`等,这些类用于实现基本类型的原子操作。 2. **数组类型**:如`AtomicIntegerArray`和`AtomicLongArray`等,它们专门针对数组提供原子操作的...

    Java多线程设计模式(带源码)

    7. 原子操作模式:使用`java.util.concurrent.atomic`包中的原子类,如`AtomicInteger`、`AtomicLong`等,实现非阻塞的原子操作,提升多线程环境下的性能。 8. 轻量级锁定模式:Java 5引入了`java.util.concurrent....

    Java多线程之进阶篇(二).docx

    `java.util.concurrent.atomic`包中的原子类提供了一种无锁编程的解决方案,它们能够在不使用`synchronized`的情况下实现线程安全的更新操作。这些原子类使用了硬件级别的CAS(Compare and Swap)操作,这是一种低级...

    Java多线程设计模式

    8. 原子操作模式:使用java.util.concurrent.atomic包中的原子类,如AtomicInteger,提供一种无锁编程的方式,保证操作的原子性。 9. 软中断和中断检查模式:通过Thread.interrupt()和Thread.isInterrupted()检查并...

    基于java的锁具装箱的源程序代码

    Java中的锁装箱是并发编程中的一个重要概念,它涉及到Java的并发工具类,特别是`java.util.concurrent.atomic`包中的原子类。锁装箱是将基本数据类型包装成对象,然后在这些对象上实现线程安全的操作,以提高多线程...

    一本经典的多线程书籍 Java并发编程 设计原则与模式 第二版 (英文原版)

    5. **原子类与并发工具类**:介绍了java.util.concurrent.atomic包中的原子类,如AtomicInteger、AtomicLong等,以及Semaphore、CountDownLatch、CyclicBarrier等并发工具类的使用场景和最佳实践。 6. **线程通信**...

    Java原子操作CAS原理解析

    然而利用atomic包中相关类型就可以很简单实现此操作,以下是一个计数程序实例: ```java public class Counter { private AtomicInteger ai = new AtomicInteger(); private int i = 0; public static void main...

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

    5. 原子操作模式:使用java.util.concurrent.atomic包中的原子类,如AtomicInteger,提供无锁的并发操作。 四、同步机制 1. synchronized关键字:用于实现线程互斥,保证同一时刻只有一个线程访问共享资源。 2. ...

    java并发编程之cas详解

    在Java中,CAS技术可以使用java.util.concurrent.atomic包中的原子类来实现原子操作。例如,使用AtomicBoolean类可以实现锁机制,使用AtomicInteger类可以实现计数器等。 CAS技术的优点 CAS技术的优点是可以在多...

Global site tag (gtag.js) - Google Analytics