并发资源共享处理方案--初级
2016-05-26 15:08
381 查看
锁机制实现:一般是最容易想到的方式,可以基于synchronized关键字,使用同步方法(大粒度)或同步代码块(小粒度),也可以使用Lock方式,更灵活的实现;
View Code
AtomicInteger的实现原理,可以参见:http://aswang.iteye.com/blog/1741871
可以参考:http://my.oschina.net/leoson/blog/107327 选择适合自己的方式
package com.share; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import org.apache.log4j.Logger; import com.alibaba.fastjson.JSON; /** * * @ClassName: ConcurrentShare * @Description: TODO(使用AtomicInteger实现多线程资源共享) * @date 2016年5月26日 下午2:50:21 * */ public class ConcurrentShare implements Runnable { private static Logger logger = Logger.getLogger(ConcurrentShare.class); private ThreadLocal<Map<String, List<Integer>>> saleTickets = new ThreadLocal<Map<String, List<Integer>>>(); /** * 使用atomic保证资源共享 */ private AtomicInteger tickets; private boolean isOver = false; public ConcurrentShare(AtomicInteger tickets) { super(); this.tickets = tickets; } @Override public void run() { while (!isOver) { sale(); } logger.info(JSON.toJSONString(saleTickets.get())); logger.info(saleTickets.get().get(Thread.currentThread().getName()).size()); } /** * * @Title: sale * @Description: TODO(售卖方法) * @return void * @date 2016年5月26日 上午9:50:10 * @throws */ private void sale() { if (tickets.get() > 0) { int t = tickets.decrementAndGet(); getBeforeTickts().get(Thread.currentThread().getName()).add(t); } else { isOver = true; } } private Map<String, List<Integer>> getBeforeTickts() { Map<String, List<Integer>> beforeTickets = saleTickets.get(); if (null == beforeTickets) { Map<String, List<Integer>> map = new HashMap<String, List<Integer>>(); map.put(Thread.currentThread().getName(), new ArrayList<Integer>()); saleTickets.set(map); beforeTickets = saleTickets.get(); } return beforeTickets; } public static void main(String[] args) { AtomicInteger tickets = new AtomicInteger(100); ConcurrentShare share = new ConcurrentShare(tickets); for (int i = 0; i < 3; i++) { new Thread(share).start(); } } }
View Code
AtomicInteger的实现原理,可以参见:http://aswang.iteye.com/blog/1741871
可以参考:http://my.oschina.net/leoson/blog/107327 选择适合自己的方式
相关文章推荐
- ios 拨打电话
- db创建较简语法示例
- Node.js 连接 MySQL 并进行数据库操作
- windows环境下搭建python机器学习开发环境
- 安卓so动态库加载代理实现,可以实现C层的类反射效果
- 详解SQL集合运算
- Linux查看内核或系统版本总结
- gulp-babel
- 自定义xib步骤
- windows下精确定时总结
- windows下精确定时总结
- PHP socket 绑定随机端口
- android-async-http简单封装--笔记
- 多个Button点击切换状态
- iOS UIAppearance使用详解-01没有图片效果
- nyoj 扩展欧几里德入门
- DB Version Control Tool "Flyway" note.
- 《JAVA语言程序设计》(五)保留两位小数的操作
- const char*转LPCWSTR的方法记录
- iOS 应用将适应新的的IPv6-only网络 -解决方案