今天写代码,尝试使用了AtomicInteger这个类,感受使用起来很爽,特别适用于高并发访问,下面贴一个简单的例子:java
使用场景:面试
由于经过WS服务获取MobileCashierViewModel 这个对象比较频繁,会很影响系统资源,能够将cvm存入缓存中,想要查看缓存cvm有多大价值,那么能够设置一个计数,来统记cvm被调用的次数算法
而后将CashierContext放入ThreadLocal中,而后再写一个过滤器,在过滤器里面能够获得获取这个服务从缓存中取的次数,这个就能够很容易看出来缓存价值。mongodb
那么为何不使用记数器自加呢,例如count++这样的,由于这种计数是线程不安全的,高并发访问时统计会有误,而AtomicInteger为何可以达到多而不乱,处理高并发应付自如呢,咱们才看看AtomicInteger的源代码:编程
你们能够看到有这个变量,value就是你设置的自加起始值。注意看它的访问控制符,是volatile,这个就是保证AtomicInteger线程安全的根源,熟悉并发的同窗必定知道在java中处理并发主要有两种方式:swift
1,synchronized关键字,这个你们应当都各类面试和笔试中常常遇到。缓存
2,volatile修饰符的使用,相信这个修饰符你们平时在项目中使用的也不是不少。安全
这里重点说一下volatile:cookie
Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存从新读取该成员的值,并且,当成员变量值发生变化时,强迫将变化的值从新写入共享内存,这样两个不一样的线程在访问同一个共享变量的值时,始终看到的是同一个值。session
java语言规范指出:为了获取最佳的运行速度,容许线程保留共享变量的副本,当这个线程进入或者离开同步代码块时,才与共享成员变量进行比对,若是有变化再更新共享成员变量。这样当多个线程同时访问一个共享变量时,可能会存在值不一样步的现象。
而volatile这个值的做用就是告诉VM:对于这个成员变量不能保存它的副本,要直接与共享成员变量交互。
建议:当多个线程同时访问一个共享变量时,能够使用volatile,而当访问的变量已在synchronized代码块中时,没必要使用。
缺点:使用volatile将使得VM优化失去做用,致使效率较低,因此要在必要的时候使用。
参考知识库