`

AtomicInteger在实际项目中的应用

阅读更多

 

今天写代码,尝试使用了AtomicInteger这个类,感觉使用起来很爽,特别适用于高并发访问,下面贴一个简单的例子:

Java代码   收藏代码
  1. CashierContext类部分代码:  
  2.   
  3. private Map<String, AtomicInteger> counter          = new HashMap<String, AtomicInteger>();  
  4.   
  5.   
  6. private void initCounter() {  
  7.      counter.put("cvm"new AtomicInteger(0));  
  8. }  
  9.   
  10. //被调用一次自动+1  
  11.   
  12. public MobileCashierViewModel getCvm() {  
  13.   
  14.         if (cvm != null) {  
  15.             counter.get("cvm").incrementAndGet();  
  16.         }  
  17.         return cvm;  
  18.     }  

 

使用场景:

因为通过WS服务获取MobileCashierViewModel 这个对象比较频繁,会很影响系统资源,可以将cvm存入缓存中,想要查看缓存cvm有多大价值,那么可以设置一个计数,来统记cvm被调用的次数

 

 

然后将CashierContext放入ThreadLocal中,然后再写一个过滤器,在过滤器里面可以得到获取这个服务从缓存中取的次数,这个就可以很容易看出来缓存价值。

 

那么为什么不使用记数器自加呢,例如count++这样的,因为这种计数是线程不安全的,高并发访问时统计会有误,而AtomicInteger为什么能够达到多而不乱,处理高并发应付自如呢,我们才看看AtomicInteger的源代码:

 

 

Java代码   收藏代码
  1. private volatile int value;  

 

 

大家可以看到有这个变量,value就是你设置的自加起始值。注意看它的访问控制符,是volatile,这个就是保证AtomicInteger线程安全的根源,熟悉并发的同学一定知道在java中处理并发主要有两种方式:

1,synchronized关键字,这个大家应当都各种面试和笔试中经常遇到。

2,volatile修饰符的使用,相信这个修饰符大家平时在项目中使用的也不是很多。

 

这里重点说一下volatile:

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

 

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

 

而volatile这个值的作用就是告诉VM:对于这个成员变量不能保存它的副本,要直接与共享成员变量交互。

 

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

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

分享到:
评论

相关推荐

    AtomicInteger 浅谈

    《AtomicInteger 浅谈》 在Java编程中,原子性操作是并发编程中非常关键的一环,它确保了在多线程环境下数据的正确性和...在实际项目中,我们需要根据具体需求和场景,灵活运用AtomicInteger,以达到最佳的并发性能。

    ViewPager+AtomicInteger实现广告轮播

    在实际应用中,我们还需要考虑其他因素,比如添加指示器来显示当前的广告位置,设置按钮让用户手动切换,或者添加缓存机制以提高加载速度。同时,为了适应各种屏幕尺寸,需要对布局进行响应式设计,确保广告轮播在...

    Java多线程与并发库高级应用

    在计算机科学中,线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程可以有多个线程,这些线程共享进程资源,每个线程有自己的栈空间和程序计数器等运行时状态。 ##...

    Java实际开发中的小技巧汇总

    在Java实际开发中,开发者经常会遇到各种挑战,需要掌握一些实用的小技巧来提高代码质量、提升效率。以下是一些从博客文章"Java实际开发中的小技巧汇总"中可能涵盖的知识点,结合“源码”和“工具”的标签,我们可以...

    人工智能-项目实践-多线程-Java多线程高并发实例.zip

    本实践案例将通过具体的代码示例,帮助你理解并掌握如何在实际项目中有效地利用多线程提升程序的执行效率。 首先,我们要理解“多线程”的概念。在单线程环境中,程序按照顺序执行任务。而在多线程环境中,一个程序...

    基于java的多线程与线程安全实践-基于Http协议的断点续传项目设计与实现(源代码).zip

    在这个项目中,可能在管理下载进度和文件拼接时使用这些机制。 3. **线程安全**:线程安全的类或方法是指在多线程环境下,无论调用顺序如何,都能保证正确执行。例如,`AtomicInteger`和`ConcurrentHashMap`等并发...

    threadsafe.zip

    通过这些代码实例,开发者可以深入理解并掌握Java多线程并发编程的核心概念和技术,以便在实际项目中灵活应用。 这个压缩包中的代码实例很可能包括了各种使用这些关键字的实际场景,如并发容器的实现、并发计数器、...

    Java 投票(自动加一)

    在Java编程中,实现一个投票系统,特别是涉及到计票功能时,经常会遇到“自动加一”的需求。这个功能通常用于统计用户的选择,例如在论坛、网站或者...在实际开发中,应根据项目规模和预期负载来设计合适的投票系统。

    六祎:使用Serlvet做的访问量统计!

    通过这个简单的实例,开发者可以学习到如何在实际项目中利用Servlet和ServletContext进行基本的统计功能开发,这将有助于理解Java Web应用程序的工作原理,以及如何进行数据共享和状态管理。同时,这也只是一个起点...

    基于RateLimiter的令牌桶算法实现限速控制和计算法实现限流控制

    在实际应用中,我们可以在Spring Boot项目中创建一个拦截器或切面,对每个请求进行拦截,然后调用RateLimiter或计数器来进行限流。对于RateLimiter,我们可以在拦截器中使用`tryAcquire()`方法尝试获取令牌,如果...

    记录应用的接口访问信息

    在开发Web应用程序时,日志记录是至关重要的,特别是对于接口访问信息的追踪。Spring Boot是一个流行的Java框架,它...在实际开发中,根据项目的具体需求,可以进一步定制化这些记录和监控机制,以满足更复杂的需求。

    Java多线程与线程安全实践-基于Http协议的断点续传.zip

    基于HTTP协议的断点续传则是一个实用的案例,展示了如何在实际项目中结合多线程技术来提高性能和用户体验。通过阅读提供的"Java多线程与线程安全实践-基于Http协议的断点续传"资料,你可以深入理解这些概念并应用于...

    java并发编程源码

    通过深入学习这些源码,开发者不仅可以理解Java并发编程的基本原理,还能掌握如何在实际项目中应用并发技术,避免并发问题,提高程序的性能和稳定性。源码学习是提高编程技能的有效途径,特别是对于复杂的并发场景,...

    Java高并发视频教学,并带实战java高并发程序设计,高并发面试题目

    Java高并发编程是Java开发中的重要领域,尤其在大规模分布式系统和互联网应用中,对高并发处理能力的要求日益提升。本资源包含了一套完整的Java高并发视频教学,以及相关的实战项目和面试题目,旨在帮助开发者深入...

    java多线程QQ聊天

    在这个聊天应用中,每个连接可能都会有一个单独的线程来处理,以便在接收和发送消息时保持响应性。线程管理是关键,包括同步、互斥以及避免死锁,以确保数据安全和程序的正确运行。 2. **Socket编程**:Java的...

    常用方法

    在实际项目中,常常会结合这些技术,例如,利用JavaScript生成动态的序列号,用于前端页面的唯一标识;使用ORM框架填充从后端获取的实体数据,并通过JavaScript处理和展示在前端。而文件名列表中的"Relaese"可能指的...

    Java多线程设计模式

    Java多线程设计模式是程序开发中的重要领域,特别是在服务器端和高性能应用中,多线程的使用可以显著提升系统的并行处理能力。本书由知名技术作者结城浩撰写,于2005年出版,得到了广泛的好评,被誉为“好书”。这...

    choujiang.zip_JAVA 抽奖_抽奖_随机抽奖

    7. **用户界面**:虽然"Lottery_Rotary"主要关注抽奖逻辑,但实际应用中,还需要一个用户友好的界面来展示抽奖过程。这可以使用JAVA Swing或JavaFX库来实现。 8. **日志记录**:为了追踪和审计抽奖过程,日志记录是...

    Lock free 论文集合,若干无锁数据结构实现的经典论文,500多页.zip

    C/C++通常用于编写高性能的系统级代码,而Java则因其跨平台和丰富的并发库在企业级应用中广泛应用,Python则以其易读性和丰富的第三方库成为教育和研究领域中的首选语言。 无锁数据结构如无锁栈、无锁队列、无锁...

Global site tag (gtag.js) - Google Analytics