`

AtomicInteger 在高并发量应用程序中的使用及volatile说明

    博客分类:
  • java
阅读更多

当我们在处理简单程序中,可以使用诸如count++这种简单的计数器,但是这种简单的处理在高并发/多线程中的使用却是不安全的,几乎可以百分百的说,得到的数据是未更新的,不是实时数据,然而在JDK1.5之后,却封装了一个类AtomicInteger 可以用来统计这种计数。

       该类中有三个变量,其中最重要的是

       private volatile int value;

       value就类似count,还有2个辅助变量用于进行更新value。其中的volatile使用可见最后说明。

        // setup to use Unsafe.compareAndSwapInt for updates

      private static final Unsafe unsafe = Unsafe.getUnsafe();

       private static final long valueOffset;

       在该类中常用方法主要是实现加1减1操作,方法分别是:

       public final int getAndIncrement();

       public final int getAndDecrement();

       

      volatile说明:

      volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存重新读取该成员的值,而且,当成员变量值发生变化时,强迫将变化的值重新写入共享内存,这样两个不同的线程在访问同一个共享变量的值时,始终看到的是同一个值。

 

      java语言规范指出:为了获取最佳的运行速度,允许线程保留共享变量的副本,当这个线程进入或者离开同步代码块时,才与共享成员变量进行比对,如果有变化再更新共享成员变量。这样当多个线程同时访问一个共享变量时,可能会存在值不同步的现象。而volatile这个值的作用就是告诉VM:对于这个成员变量不能保存它的副本,要直接与共享成员变量交互。

 

     建议:当多个线程同时访问一个共享变量时,可以使用volatile,而当访问的变量已在synchronized代码块中时,不必使用。

     缺点:使用volatile将使得VM优化失去作用,导致效率较低,所以要在必要的时候使用。

 

     除了volatile外,对于线程安全加锁的,我们接触更多的是synchronized。这里就不在做更多的说明。

分享到:
评论

相关推荐

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段31讲、如何给你的应用程序注入钩子程序,Linux下演示.mp4 │ 高并发编程第一阶段32讲、如何捕获线程运行期间的异常.mp4 │ 高并发编程第一阶段33讲、ThreadGroup API介绍之一.mp4 │ 高...

    AtomicInteger并发测试

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

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第一阶段31讲、如何给你的应用程序注入钩子程序,Linux下演示.mp4 │ 高并发编程第一阶段32讲、如何捕获线程运行期间的异常.mp4 │ 高并发编程第一阶段33讲、ThreadGroup API介绍之一.mp4 │ 高...

    java并发之AtomicInteger源码分析

    AtomicInteger是java并发包下面提供的原子类,主要操作的是int类型的整型,通过调用底层Unsafe的CAS等方法实现原子操作。下面小编和大家一起学习一下

    Java AtomicInteger类使用方法实例讲解

    主要介绍了Java AtomicInteger类使用方法实例讲解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

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

    主要介绍了Java中对AtomicInteger和int值在多线程下递增操作的测试,本文得出AtomicInteger操作 与 int操作的效率大致相差在50-80倍上下的结论,需要的朋友可以参考下

    Java AtomicInteger类的使用方法详解

    主要介绍了Java AtomicInteger类的使用方法详解,文中有具体实例代码,具有一定参考价值,需要的朋友可以了解下。

    Java并发编程相关源码集 包括多任务线程,线程池等.rar

    volatile关键字的非原子性、volatile关键字的使用、AtomicInteger原子性操作、线程安全小例子:多个线程竞争问题、多个线程多个锁问题、创建一个缓存的线程池、多线程使用Vector或者HashTable的示例(简单线程同步问题...

    AtomicInteger的使用,CAS的工作原理

    比较当前工作内存的值和主内存的值,如果相同则只需规定操作,否则继续比较直到内存和工作内存中的值一致为止 AtomicInteger atomicInteger = new AtomicInteger(5); atomicInteger.compareAndSet(5, 2020) + \t ...

    AtomicInteger 浅谈

    NULL 博文链接:https://zcmor.iteye.com/blog/1535524

    ViewPager+AtomicInteger实现广告轮播

    利用ViewPager实现的广告轮播,没有触摸事件的时候可以定时轮播广告,有触摸事件实施触摸事件。自动轮播使用的是线程加AtomicInteger的方式实现。

    Java多线程大量调用百度地图的搜索功能,来做课程作业数据准备

    askForBaidu Java多线程大量调用百度地图的搜索功能,来做课程作业数据准备 读取xls 采用了apache.poi,说实话,使用体验上来说...因为百度地图并发量的计算是按每秒钟的访问量来定的,所以即使只开了10个线程,也很

    基于Java+MySQL设计与实现的秒杀与抢购模型架构【100013279】

    对高并发高负载情形下的应用场景进行分析,以高效地处理资源竞争为目的,设计一个秒杀与抢购模型。 本项目提供了三种解决方案来比较系统的性能: 1.利用MySQL的update行锁实现悲观锁。 2.MySQL加字段version实现乐观...

    AtomicIntegerExample:AtomicInteger示例

    AtomicInteger示例AtomicInteger用于原子增量计数器之类的应用程序。 简短的示例代码: public class AtomicIntegerExample { private final ExecutorService execService = Executors . newFixedThreadPool( 100 );...

    java并发工具包详解

    1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版

    中英文版的 pdf 均带有书签,方便读者朋友查阅。 java_util_concurrent_user_guide_cn.pdf 内容预览: 1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4...

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版.pdf

    信号量 Semaphore 16. 执行器服务 ExecutorService 17. 线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService 19. 使用 ForkJoinPool 进行分叉和合并 20. 锁 Lock 21. 读写锁 ...

    redis-demo:spring boot高并发秒杀测试

    redis高并发秒杀测试测试项目: : 准备使用docker-compose命令启动redis服务器(可以用其他方式启动) idea启动测试项目jmeter测试脚本 重现秒杀时出现的超卖问题核心测试代码如下: /** * 用于测试redis秒杀 */@...

    e语言-易语言线程安全之原子锁与读写锁

    ' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、参数及返回值类型。 调试输出 (ai....

    使用Java的Memory Model实现一个简单的计数器.txt

    在这个计数器中,我们使用`AtomicInteger`的`incrementAndGet()`方法来实现自增操作,并使用`get()`方法来获取当前计数器的值。由于这些操作都是原子性的,因此可以保证在多线程环境下的安全性和正确性。

Global site tag (gtag.js) - Google Analytics