【Java多线程】AtomicInteger使用
来源:互联网 发布:萤火虫壁纸软件手机 编辑:程序博客网 时间:2024/05/22 00:20
AtomicInteger 提供了线程安全的方法,一般用于多线程并发计数。
在今天遇到使用AtomicInteger的源码,发现它的逻辑有点漏洞,故写了以下代码抽象出大概逻辑,来验证自己的想法。
废话少说先上代码,UILCacheSizeTest该类提供指定大小上限sizeLimit,而以下代码时上限失效了。
存在该问题的原因是AtomicInteger 的方法是线程安全的,但UILCacheSizeTest的方法并非线程安全。这样的写法会让cacheSize被多线程重入。
从而导致实际的cacheSize会偶尔超出sizeLimit。感兴趣的朋友可以运行下代码。
解决方案很简单:就是一个方法内对cacheSize的操作都放进synchronize的同步块中。
import java.util.Random;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicInteger;public class UILCacheSizeTest implements Runnable{ private static final int MAX_COUNT = 1000; private final int sizeLimit; private AtomicInteger cacheSize = new AtomicInteger(); public UILCacheSizeTest(int sizeLimit) { this.sizeLimit = sizeLimit; } private int randomInt(int min, int max) { Random random = new Random(); int s = random.nextInt(min+1) + max-min; return s; } private int randomInner() { return randomInt(100, 200); } public void run() { int sizeToADD = randomInner(); int curCacheSize = cacheSize.get(); while (curCacheSize + sizeToADD > sizeLimit) { curCacheSize = cacheSize.addAndGet(-100); } cacheSize.addAndGet(sizeToADD); int newCacheSize = cacheSize.get(); if (newCacheSize > sizeLimit) { System.out.println("confict = " + newCacheSize); } } public static void main(String[] args) { ThreadPoolExecutor exe = new ThreadPoolExecutor(10, 10, 3000, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(1000)); UILCacheSizeTest runObj = new UILCacheSizeTest(1000); for (int i = 0; i < MAX_COUNT; i ++) { exe.execute(runObj); } }}
0 0
- 【Java多线程】AtomicInteger使用
- 多线程之AtomicInteger的使用
- java 多线程 AtomicInteger原子变量
- Java中AtomicInteger的使用!!!
- Java的多线程编程模型之AtomicInteger
- volatile AtomicInteger java多线程操作 原子性
- 多线程1:AtomicInteger的使用,多线程叠加或叠减
- AtomicInteger使用
- AtomicInteger 使用
- AtomicInteger使用
- Java AtomicInteger
- java AtomicInteger
- Java AtomicInteger
- Java AtomicInteger
- Java AtomicInteger
- Java之voliate, synchronized, AtomicInteger使用
- Java之voliate, synchronized, AtomicInteger使用
- Java之voliate, synchronized, AtomicInteger使用
- 用API给用户添加职责
- OCP-1Z0-新051-61题版本-10
- sql 语句 优化
- linux中shell变量$#,$@,$0,$1,$2的含义解释
- “0xC015000F 正在被停用的激活上下文不是最近激活的”错误解决方法
- 【Java多线程】AtomicInteger使用
- 看懂论文的机器学习基本知识(二)
- 编译小结(8)巧用脚本做多系统多数据库版本程序的自动化编译
- 在MyEclipse2014中利用hibernate将oracle 11g中的“表”反转成“类”的步骤。
- 用API创建用户
- 【html】html 的基本标签的用法
- Android_PopupWindow使用介绍
- ubuntu安装fcitx失败Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution)
- C# 异步显示进度条的两种方法(BackgroundWorker和Thread)