最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java基于ConcurrentHashMap設(shè)計(jì)細(xì)粒度實(shí)現(xiàn)代碼

 更新時(shí)間:2017年10月14日 15:24:42   作者:犀利java  
這篇文章主要介紹了java基于ConcurrentHashMap設(shè)計(jì)細(xì)粒度實(shí)現(xiàn)代碼,通過ConcurrentHashMap實(shí)現(xiàn)細(xì)粒度,具有一定參考價(jià)值,需要的朋友可以了解。

細(xì)粒度鎖:

       java中的幾種鎖:synchronized,ReentrantLock,ReentrantReadWriteLock已基本可以滿足編程需求,但其粒度都太大,同一時(shí)刻只有一個(gè)線程能進(jìn)入同步塊,這對(duì)于某些高并發(fā)的場(chǎng)景并不適用。比如銀行客戶a向b轉(zhuǎn)賬,c向d轉(zhuǎn)賬,假如這兩個(gè)線程并發(fā),代碼其實(shí)不需要同步。但是同時(shí)有線程3,e向b轉(zhuǎn)賬,那么對(duì)b而言必須加入同步。這時(shí)需要考慮鎖的粒度問題,即細(xì)粒度鎖。

    網(wǎng)上搜尋了一些關(guān)于java細(xì)粒度鎖的介紹文章,大部分是提供思路,比如樂觀鎖,String.intern()和類ConcurrentHashMap,本人對(duì)第三種比較感興趣,為此研究了下ConcurrentHashMap的源碼。基于ConcurrentHashMap設(shè)計(jì)細(xì)粒度大志思路如下

Map locks = new Map();
 List lockKeys = new List();
for (int number : 1 - 10000) {
	Object lockKey = new Object();
	lockKeys.add(lockKey);
	locks.put(lockKey, new Object());
}
public void doSomeThing(String uid) {
	Object lockKey = lockKeys.get(uid.hash() % lockKeys.size());
	Object lock = locks.get(lockKey);
	synchronized(lock) {
		// do something
	}
}

具體實(shí)現(xiàn)如下:

public class LockPool {
	//用戶map
	private static ConcurrentHashMap<String,Object> userMap=new ConcurrentHashMap<String,Object>();
	//用戶金額map
	private static ConcurrentHashMap<String,Integer> moneyMap=new ConcurrentHashMap<String,Integer>();
	public static void main(String[] args) {
		LockPool lockPool=new LockPool();
		ExecutorService service = Executors.newCachedThreadPool();
		service.execute(lockPool.new Boss("u2"));
		service.execute(lockPool.new Boss("u1"));
		service.execute(lockPool.new Boss("u1"));
		service.execute(lockPool.new Boss("u3"));
		service.execute(lockPool.new Boss("u2"));
		service.execute(lockPool.new Boss("u2"));
		service.execute(lockPool.new Boss("u3"));
		service.execute(lockPool.new Boss("u2"));
		service.execute(lockPool.new Boss("u2"));
		service.execute(lockPool.new Boss("u4"));
		service.execute(lockPool.new Boss("u2"));
		service.shutdown();
	}
	class Boss implements Runnable{
		private String userId;
		Boss(String userId){
			this.userId=userId;
		}
		@Override
		    public void run() {
			addMoney(userId);
		}
	}
	public static void addMoney(String userId){
		Object obj=userMap.get(userId);
		if(obj==null){
			obj=new Object();
			userMap.put(userId,obj);
		}
		//obj是與具體某個(gè)用戶綁定,這里應(yīng)用了synchronized(obj)的小技巧,而不是同步當(dāng)前整個(gè)對(duì)象
		synchronized (obj) {
			try {
				System.out.println("-------sleep4s--------"+userId);
				Thread.sleep(4000);
				System.out.println("-------awake----------"+userId);
			}
			catch (InterruptedException e) {
				e.printStackTrace();
			}
			if(moneyMap.get(userId)==null){
				moneyMap.put(userId,1);
			} else{
				moneyMap.put(userId, moneyMap.get(userId)+1);
			}
			System.out.println(userId+"-------moneny----------"+moneyMap.get(userId));
		}
	}
}

 測(cè)試結(jié)果:

-------sleep4s--------u2
-------sleep4s--------u1
-------sleep4s--------u3
-------sleep4s--------u4
-------awake----------u2
-------awake----------u3
-------awake----------u1
u2-------moneny----------1
u1-------moneny----------1
-------sleep4s--------u1
u3-------moneny----------1
-------sleep4s--------u2
-------sleep4s--------u3
-------awake----------u4
u4-------moneny----------1
-------awake----------u1
u1-------moneny----------2
-------awake----------u3
u3-------moneny----------2
-------awake----------u2
u2-------moneny----------2
-------sleep4s--------u2
-------awake----------u2
u2-------moneny----------3
-------sleep4s--------u2
-------awake----------u2
u2-------moneny----------4
-------sleep4s--------u2
-------awake----------u2
u2-------moneny----------5
-------sleep4s--------u2
-------awake----------u2
u2-------moneny----------6

測(cè)試結(jié)果來(lái)看,只有相同userId的線程才會(huì)互斥,同步等待;不同userId的線程沒有同步

總結(jié)

以上就是本文關(guān)于java基于ConcurrentHashMap設(shè)計(jì)細(xì)粒度實(shí)現(xiàn)代碼的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以參閱:權(quán)限控制之粗粒度與細(xì)粒度概念及實(shí)現(xiàn)簡(jiǎn)單介紹、javaweb設(shè)計(jì)中filter粗粒度權(quán)限控制代碼示例等,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!

相關(guān)文章

最新評(píng)論

洪江市| 北辰区| 文成县| 广昌县| 武乡县| 凌云县| 富阳市| 色达县| 兴隆县| 昭平县| 玛曲县| 荔浦县| 武威市| 京山县| 六枝特区| 云梦县| 新龙县| 舟曲县| 尼勒克县| 深圳市| 彭山县| 财经| 教育| 大名县| 衡东县| 嘉定区| 宽甸| 孝感市| 安岳县| 东乡县| 健康| 东平县| 达尔| 治县。| 巨野县| 荥阳市| 武定县| 巍山| 栾川县| 碌曲县| 五家渠市|