激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java基于ConcurrentHashMap設計細粒度實現代碼

java基于ConcurrentHashMap設計細粒度實現代碼

2021-01-18 09:56犀利java Java教程

這篇文章主要介紹了java基于ConcurrentHashMap設計細粒度實現代碼,通過ConcurrentHashMap實現細粒度,具有一定參考價值,需要的朋友可以了解。

細粒度鎖:

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
    }
}

具體實現如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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是與具體某個用戶綁定,這里應用了synchronized(obj)的小技巧,而不是同步當前整個對象
        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));
        }
    }
}

 測試結果:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
-------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

測試結果來看,只有相同userId的線程才會互斥,同步等待;不同userId的線程沒有同步

總結

以上就是本文關于java基于ConcurrentHashMap設計細粒度實現代碼的全部內容,希望對大家有所幫助。如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

原文鏈接:http://www.cnblogs.com/xilijava/p/4569333.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美一级淫片免费视频黄 | 中文字幕11 | 法国性hdfreexxxx人妖 | 国产成人午夜高潮毛片 | 中国漂亮护士一级a毛片 | 成人午夜免费在线视频 | 99精品视频免费 | 精品午夜影院 | av在线免费观看中文字幕 | 久久国产精品91 | www久久国产| www.69色| 国产韩国精品一区二区三区久久 | 午夜视频在线免费观看 | 成人在线免费视频播放 | 天天草天天干天天 | 欧美wwwwww| 国产91在线播放九色 | 亚洲五码在线观看视频 | 91成人久久| 久久17| 国产亚洲欧美在线视频 | 中文字幕国产欧美 | 久久久tv| 精品亚洲综合 | 亚洲成人午夜精品 | 美国黄色毛片女人性生活片 | 免费高清一级欧美片在线观看 | 成人av一区二区免费播放 | 国产女同玩人妖 | 久久成人免费网 | 久久久久久久久久久久久久久伊免 | 中文字幕爱爱视频 | 狠狠操夜夜爱 | 国产精品久久久久久影院8一贰佰 | 黄色大片免费看 | 情侣啪啪网站 | 色淫湿视频 | 国产91av视频 | 一级做受大片免费视频 | 欧美亚洲免费 |