AtomicInteger。一个提供原子操作的Integer的类。

在Java语言中,++i和i++操作并非线程安全的。在使用的时候,不可避免的会用到synchronized关键字。

而AtomicInteger则通过一种线程安全的加减操作接口。

样例:Java代码:

CashierContext类部分代码:  

private Map<String, AtomicInteger> counter          = new HashMap<String, AtomicInteger>();  

private void initCounter() {
counter.put("cvm", new AtomicInteger(0));
} //被调用一次自己主动+1 public MobileCashierViewModel getCvm() { if (cvm != null) {
counter.get("cvm").incrementAndGet();
}
return cvm;
}

使用场景:

由于通过WS服务获取MobileCashierViewModel 这个对象比較频繁,会非常影响系统资源。能够将cvm存入缓存中,想要查看缓存cvm有多大价值,那么能够设置一个计数,来统记cvm被调用的次数

然后将CashierContext放入ThreadLocal中,然后再写一个过滤器,在过滤器里面能够得到获取这个服务从缓存中取的次数,这个就能够非常easy看出来缓存价值。

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

Java代码

private volatile int value;  

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

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

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

这里重点说一下volatile:

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

java语言规范指出:为了获取最佳的执行速度,同意线程保留共享变量的副本,当这个线程进入或者离开同步代码块时。才与共享成员变量进行比对,假设有变化再更新共享成员变量。

这样当多个线程同一时候訪问一个共享变量时。可能会存在值不同步的现象。

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

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

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

引用自:

http://haininghacker-foxmail-com.iteye.com/blog/1401346

AtomicInteger在实际项目中的应用的更多相关文章

  1. 项目中遇到的死锁问题: Lock wait timeout exceeded; try restarting transaction

    最近项目中频繁出现  Lock wait timeout exceeded; try restarting transaction这个错误,把我们弄得痛苦不堪啊,为了解决问题,上网上找好多资料,终于把 ...

  2. SSH 项目中 使用websocket 实现网页聊天功能

    参考文章  :java使用websocket,并且获取HttpSession,源码分析    http://www.cnblogs.com/zhuxiaojie/p/6238826.html 1.在项 ...

  3. VS项目中使用Nuget还原包后编译生产还一直报错?

    Nuget官网下载Nuget项目包的命令地址:https://www.nuget.org/packages 今天就遇到一个比较奇葩的问题,折腾了很久终于搞定了: 问题是这样的:我的解决方案原本是好好的 ...

  4. ABP项目中使用Swagger生成动态WebAPI

    本文是根据角落的白板报的<使用ABP实现SwaggerUI,生成动态webapi>一文的学习总结,感谢原文作者角落的白板报. 1 安装Swashbuckle.core 1.1 选择WebA ...

  5. iOS 之项目中遇到的问题总结

    昨天去一家公司面试,面试官问了我在项目开发中遇到过哪些问题,是什么引起的,怎样解决的? 当时由于有点小紧张只说出了一两点,现在就来好好总结一下. 问题: 1.两表联动 所谓的两表联动就是有左右两个表格 ...

  6. My97DatePicker时间控件在项目中的应用

    一.下载My97DatePicker的压缩包My97DatePicker.rar,解压. 注:My97DatePicker最新版本有开发包,项目中使用时删掉,以便节省空间,提高程序的运行效率. 二.在 ...

  7. 在项目中同时使用Objective-C和Swift

    苹果发布的Swift语言可以和之前的Objective-C语言同时存在于一个项目中. 可能有人会认为是同一个类文件中既可以有Objective-C也可以有Swift,这是不对的.同一个类文件或同一个代 ...

  8. 在数据库访问项目中使用微软企业库Enterprise Library,实现多种数据库的支持

    在我们开发很多项目中,数据访问都是必不可少的,有的需要访问Oracle.SQLServer.Mysql这些常规的数据库,也有可能访问SQLite.Access,或者一些我们可能不常用的PostgreS ...

  9. 在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入

    在我之前介绍的混合式开发框架中,其界面是基于Winform的实现方式,后台使用Web API.WCF服务以及直接连接数据库的几种方式混合式接入,在Web项目中我们也可以采用这种方式实现混合式的接入方式 ...

随机推荐

  1. 解决webstorm安装babel卡死问题

    2017.07.16 现在大家可以直接使用yarn的方式安装包,可以解决babel目录过长导致webstorm卡死的问题. yarn的安装不会执行组件命令就不会导致node_modules下面继续嵌套 ...

  2. hihoCoder #1161 八卦的小冰

    题目大意 考虑一个由 $n$ 个人构成的社交网络,其中任意两人都有一个用非负整数表示的亲密度. 初始时给出 $m$ 对人的亲密度,其余的亲密度为 $0$ . 定义此社交网络的「八卦度」为异性之间的亲密 ...

  3. javaweb-简单的验证码和算术验证码

    我们登陆网站时,每次都会填写一些验证码,这些验证码的作用:防止被恶意攻击,验证码上面的字母数字一般都是随机生成的,因此我们首先要写一个方法生成一个随机的字符串,这里就需要java里面的随机函数Rand ...

  4. java面试题之你了解守护线程吗?它和非守护线程有什么区别

    程序运行完毕,jvm会等待非守护线程完成后关闭,但是jvm不会等待守护线程. 守护线程最典型的的例子是:GC线程

  5. [暑假集训--数位dp]hdu5787 K-wolf Number

    Alice thinks an integer x is a K-wolf number, if every K adjacent digits in decimal representation o ...

  6. socket编程-微软小兵

    socket两端建立连接,不断开的连接的情况下做数据交互,客户端发送数据和服务端返回数据.直到客户端要求断开,则关闭连接. 代码目录结构:

  7. 【bzoj4031】[HEOI2015]小Z的房间 && 【bzoj4894】天赋 (矩阵树定理)

    来两道矩阵树模板: T1:[bzoj4031][HEOI2015]小Z的房间 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形 ...

  8. COGS728. [网络流24题] 最小路径覆盖问题

    算法实现题8-3 最小路径覆盖问题(习题8-13) ´问题描述: 给定有向图G=(V,E).设P是G的一个简单路(顶点不相交)的集合.如果V中每个顶点恰好在P的一条路上,则称P是G的一个路径覆盖.P中 ...

  9. linux shmget shmctl

    shmgetint shmget(key_t key, size_t size, int flag);key: 标识符的规则size:共享存储段的字节数flag:读写的权限返回值:成功返回共享存储的i ...

  10. Xcode 如何计算整个项目的代码行数

    参考链接:https://www.cnblogs.com/sunfuyou/p/7921538.html 1.打开终端 2.cd 空格 将工程的文件夹拖到终端上,回车,此时进入到工程的路径 此时已经进 ...