小編給大家分享一下java中如何實(shí)現(xiàn)ConcurrentHashMap設(shè)計(jì)細(xì)粒度,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
成都創(chuàng)新互聯(lián)公司致力于網(wǎng)站建設(shè),網(wǎng)站制作設(shè)計(jì),營銷網(wǎng)頁按需網(wǎng)站建設(shè),外貿(mào)網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),小程序制作,網(wǎng)站SEO優(yōu)化,網(wǎng)站設(shè)計(jì)制作案例豐富,是成都做網(wǎng)站公司和建站公司,歡迎咨詢。
細(xì)粒度鎖:
java中的幾種鎖:synchronized,ReentrantLock,ReentrantReadWriteLock已基本可以滿足編程需求,但其粒度都太大,同一時(shí)刻只有一個(gè)線程能進(jìn)入同步塊,這對(duì)于某些高并發(fā)的場景并不適用。比如銀行客戶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)); } } }
測試結(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
測試結(jié)果來看,只有相同userId的線程才會(huì)互斥,同步等待;不同userId的線程沒有同步
以上是“java中如何實(shí)現(xiàn)ConcurrentHashMap設(shè)計(jì)細(xì)粒度”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
網(wǎng)站名稱:java中如何實(shí)現(xiàn)ConcurrentHashMap設(shè)計(jì)細(xì)粒度
URL網(wǎng)址:http://sd-ha.com/article22/jsjsjc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、、建站公司、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站排名、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)