您的位置:首页 > 其它

并发资源共享处理方案--初级

2016-05-26 15:08 381 查看
锁机制实现:一般是最容易想到的方式,可以基于synchronized关键字,使用同步方法(大粒度)或同步代码块(小粒度),也可以使用Lock方式,更灵活的实现;

  

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 选择适合自己的方式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: