`
y806839048
  • 浏览: 1116981 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

AtomicInteger

阅读更多

AtomicInteger(AtomicBoolean、AtomicInteger、AtomicLong、AtomicReference(引用对像))系列使用synchronized结合volatile,和CAS算法实现了标记变量在多线程中的安全。

 

 

CAS(compare-and-swap)算法 保证了原子性。

 

其中CAS算法的原理就是里面包含三个值:内存值A  预估值V  更新值 B  当且仅当 V == A 时,V = B; 否则,不会执行任何操作。

 

 

1,代码块的线程安全(synchronized,lock)

2,变量的线程安全:普通值的线程安全(volatile,atomic*),数据结构的线程安全(concurrenthashmap,threadlocal,copyonwriterarraylist,blockingqueue)

 

 

 

 

AtomicInteger类保证线程安全的用法

 

J2SE 5.0提供了一组atomic class来帮助我们简化同步处理。基本工作原理是使用了同步synchronized的方法实现了对一个long, integer, 对象的增、减、赋值(更新)操作. 比如对于++运算符AtomicInteger可以将它持有的integer 能够atomic 地递增。在需要访问两个或两个以上 atomic变量的程序代码(或者是对单一的atomic变量执行两个或两个以上的操作)通常都需要被synchronize以便两者的操作能够被当作是一个atomic的单元。

java多线程用法-使用AtomicInteger
下面通过简单的两个例子的对比来看一下 AtomicInteger 的强大的功能
class Counter {
private volatile int count = 0;
 
public synchronized void increment() {
count++;  //若要线程安全执行执行count++,需要加锁
}
 
public int getCount() {
return count;
}
}
 
class Counter {
private AtomicInteger count = new AtomicInteger();
 
public void increment() {
count.incrementAndGet();
}
       //使用AtomicInteger之后,不需要加锁,也可以实现线程安全。
public int getCount() {
return count.get();
}
}
从上面的例子中我们可以看出:使用AtomicInteger是非常的安全的
那么为什么不使用记数器自加呢,例如count++这样的,因为这种计数是线程不安全的,高并发访问时统计会有误,而AtomicInteger为什么能够达到多而不乱,处理高并发应付自如呢?
这是由硬件提供原子操作指令实现的。在非激烈竞争的情况下,开销更小,速度更快。Java.util.concurrent中实现的原子操作类包括:
AtomicBoolean、AtomicInteger、AtomicLong、AtomicReference。

  另外其底层就是volatile和CAS 共同作用的结果:

     1.首先使用了volatile 保证了内存可见性。

     2.然后使用了CAS(compare-and-swap)算法 保证了原子性。

       其中CAS算法的原理就是里面包含三个值:内存值A  预估值V  更新值 B  当且仅当 V == A 时,V = B; 否则,不会执行任何操作。

 

 

 

分享到:
评论

相关推荐

    AtomicInteger 浅谈

    《AtomicInteger 浅谈》 在Java编程中,原子性操作是并发编程中非常关键的一环,它确保了在多线程环境下数据的正确性和一致性。AtomicInteger是Java并发包java.util.concurrent.atomic中的一个类,提供了对单个整型...

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

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

    AtomicInteger并发测试

    测试java.util.concurrent.atomic.AtomicInteger的类 与直接使用int做区别

    ViewPager+AtomicInteger实现广告轮播

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

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

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

    Java AtomicInteger类使用方法实例讲解

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

    Java AtomicInteger类的使用方法详解

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

    java并发之AtomicInteger源码分析

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

    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的Memory Model实现一个简单的计数器.txt

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

    15个顶级Java多线程面试题及回答.docx

    private AtomicInteger count = new AtomicInteger(0); public void increment() { count.incrementAndGet(); } public int getCount() { return count.get(); } } ``` #### 题目八:`volatile`关键字 **...

    java多线程自增效率比较及原理解析

    AtomicInteger count = new AtomicInteger(); count.addAndGet(1); ``` **效率分析**: `AtomicInteger`相比`synchronized`具有更好的并发性能,尤其是在高并发场景下。 ##### 3. LongAdder `LongAdder`是JDK8引入的...

    Java 投票(自动加一)

    private AtomicInteger voteCount = new AtomicInteger(0); public void vote() { voteCount.incrementAndGet(); } public int getVoteCount() { return voteCount.get(); } } ``` 在这个例子中,`vote()`...

    Java并发——无锁实现

    AtomicInteger atomicInteger = new AtomicInteger(0); // 获取当前值 int current = atomicInteger.get(); // 设置新值 atomicInteger.set(10); // 增加1并返回旧值 int previous = atomicInteger....

    springboot 集成 webSocket

    private static AtomicInteger online = new AtomicInteger(); //concurrent包的线程安全Set,用来存放每个客户端对应的WebSocketServer对象。 private static ConcurrentHashMap, Session> sessionPools = new ...

    java多线程中的原子操作

    在Java中,`java.util.concurrent.atomic`包提供了多种原子类,如AtomicInteger、AtomicLong等,这些类支持原子性的增加、减小、更新等操作,避免了显式的同步锁的使用,提高了并发性能。例如,AtomicInteger的...

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

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

    Java多线程编程的多线程编程中的挑战.docx

    private static final AtomicInteger COUNT_VALUE = new AtomicInteger(0); int count() { while (COUNT_VALUE.get() >= 100) { COUNT_VALUE.set(1); } COUNT_VALUE.incrementAndGet(); return COUNT_VALUE....

Global site tag (gtag.js) - Google Analytics