国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成人区精品一区二区毛片不卡 | 国产韩国精品一区二区三区 | 精品九色 | 91久久精品日日躁夜夜躁国产 | 亚洲视频中文字幕 | 精品婷婷 | 91精品一区二区三区久久久久久 | 黄色裸体网站 | 美女久久 | 精品一区二区av | 国产区在线观看 | 国产精品视频在线播放 | 小泽玛丽娅 | av在线日韩 | 日韩成人影院 | 中文字幕一区二区三区精彩视频 | 色婷婷综合久久 | 欧美日日| 蜜臀精品久久久久久蜜臀 | 黄色片在线 | 夜夜嗨aⅴ免费视频 | 日韩成人精品在线 | 亚洲欧美视频在线观看 | 插插射啊爱视频日a级 | 一级毛毛片 | 国产欧美视频在线 | 久久99精品久久久久婷婷暖91 | 午夜精品一区 | 国产精品久久久久久久一区探花 | 91在线区| 黄色av大片在线观看 | 久久精品视频一区 | 精品成人一区二区三区 | 日韩有码一区二区三区 | 成人av在线网 | 日韩欧美的一区二区 | 欧美视频网 | 日韩大片在线观看 | 性色av一区二区三区红粉影视 | 自拍第1页 | 精品成人久久 |