一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

java線程深度解析(七)

 liang1234_ 2019-01-29

http://blog.csdn.net/Daybreak1209/article/details/51415995


一、并發(fā)List

1、Vector

java核心數(shù)據(jù)結(jié)構(gòu)(一)——List類族一文中已經(jīng)提到List類簇中ArrayList和Vector的主要區(qū)別就是Vector的大部分實(shí)現(xiàn)都支持線程安全,代碼也展示了一部分。另外如果使用到ArrayList有需要進(jìn)行線程安全控制,可以調(diào)用Collections.synchronizedList(arrayList)傳入ArrayList。

2、CopyOnWriteArrayList

    實(shí)現(xiàn)機(jī)制:當(dāng)對象進(jìn)行讀操作時,由于對象未發(fā)生改變,無需進(jìn)行加鎖同步;執(zhí)行寫操作,試圖改變對象時,則復(fù)制該對象先獲取該對象的副本,對副本進(jìn)行修改,最后將副本寫回。這種實(shí)現(xiàn)方法減少了鎖競爭,提高了高并發(fā)時讀的性能,但寫操作有所犧牲。

對比CopyOnWriteArrayList和Vector的get方法實(shí)現(xiàn)可以得知:

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. public E get(int index) {  
  2.        return get(getArray(), index);  
  3.    }   
  4.    final Object[] getArray() {  
  5.        return array;  
  6.    }    
  7.    //Vector  
  8. public synchronized E get(int index) {  
  9.        if (index >= elementCount)  
  10.            throw new ArrayIndexOutOfBoundsException(index);  
  11.        return elementData(index);  
  12.    }    
      Vector采用synchronized 關(guān)鍵字,所有的get操作都需要先獲取對象鎖才能進(jìn)行。在高并發(fā)情況下,大量的鎖競爭也會降低系統(tǒng)性能。所以在多讀少寫的需求中應(yīng)優(yōu)先使用CopyOnWriteArrayList,而少讀多寫時使用vector,做好合理選擇就行。

二、并發(fā)Set

1、CopyOnWriteArraySet-內(nèi)部實(shí)現(xiàn)完全依賴于CopyOnWriteArrayList,同樣也適用于讀多寫少的并發(fā)場合。

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. private final CopyOnWriteArrayList<E> al;    
  2. public int size() {  
  3.        return al.size();  
  4.    }    
  5. public void clear() {  
  6.        al.clear();  
  7.    }    
       應(yīng)對并發(fā)寫時,可以調(diào)用Collections.sysnchronizedSet方法得到一個線程安全的set集合。

三、并發(fā)Map

1、ConcurrentHashMap

    Map類簇中的HashTable是底層添加了線程安全控制的map數(shù)據(jù)結(jié)構(gòu),但在高并發(fā)環(huán)境下效率低下,因?yàn)樗性L問HashTable的線程都必須競爭同一把鎖,造成大量線程競爭鎖。

   而ConcurrentHashMap把數(shù)據(jù)進(jìn)行分塊加鎖,也就是使用鎖分離技術(shù),添加多把鎖,每一把鎖作用于一部分?jǐn)?shù)據(jù),那么當(dāng)多線程訪問不同數(shù)據(jù)段的數(shù)據(jù)時,線程間會減少鎖競爭,從而可以有效提高并發(fā)訪問效率,ConcurrentHashMap使用鎖分段技術(shù)提高并發(fā)讀寫效率。

  

具體查看源碼可知,ConcurrentHashMap的get方法都是無鎖的,為多線程并發(fā)下的性能提供了保證。

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. public V get(Object key) {  
  2.        Node<K,V>[] tab; Node<K,V> e, p; int n, eh; K ek;  
  3.        int h = spread(key.hashCode());  
  4.        if ((tab = table) != null && (n = tab.length) > 0 &&  
  5.            (e = tabAt(tab, (n - 1) & h)) != null) {  
  6.            if ((eh = e.hash) == h) {  
  7.                if ((ek = e.key) == key || (ek != null && key.equals(ek)))  
  8.                    return e.val;  
  9.            }  
  10.            else if (eh < 0)  
  11.                return (p = e.find(h, key)) != null ? p.val : null;  
  12.            while ((e = e.next) != null) {  
  13.                if (e.hash == h &&  
  14.                    ((ek = e.key) == key || (ek != null && key.equals(ek))))  
  15.                    return e.val;  
  16.            }  
  17.        }  
  18.        return null;  
  19.    }    
  20.    static final int spread(int h) {  
  21.        return (h ^ (h >>> 16)) & HASH_BITS;  
  22.    }    
        這也警示開發(fā)人員,在高并發(fā)下,既要保證線程安全,又需要合理是用安全控制技術(shù),例如添加關(guān)鍵字、各種Lock類型。否則造成線程惡性競爭鎖,或者死鎖現(xiàn)象,程序最終潰堤。

2、Collections.synchronizedMap(map)

對于未進(jìn)行線程安全控制的map結(jié)果,也可通過Collections類提供的synchronizedMap進(jìn)行控制。

四、并發(fā)Queue

1、ConcurrentLinkedQueue-高性能隊(duì)列

ConcurrentLinkedQueue是適用于高并發(fā)下的隊(duì)列類型。通過無鎖的方式實(shí)現(xiàn)。

2、BlockingQueue-阻塞隊(duì)列

BlockingQueue的應(yīng)用場景主要是用于線程間數(shù)據(jù)共享,在生產(chǎn)者-消費(fèi)者模式中(java線程深度解析(五)——并發(fā)模型(生產(chǎn)者-消費(fèi)者)文中有介紹),作為一個數(shù)據(jù)倉庫,生產(chǎn)者往里put數(shù)據(jù),消費(fèi)者poll數(shù)據(jù)。當(dāng)隊(duì)列被裝滿了,當(dāng)生產(chǎn)者在試圖往里放數(shù)據(jù)時,就會被阻塞等待。這里就涉及到相關(guān)的任務(wù)處理策略和拒絕服務(wù)策略。在上文中都有具體講述。 

五、總結(jié)

并發(fā)的數(shù)據(jù)結(jié)構(gòu)主要就是這些,List的 Vector(synchronized 關(guān)鍵字,讀少寫多) 和CopyOnWriteArrayList(復(fù)制副本,讀多寫少),Set的CopyOnWriteArraySet(特點(diǎn)同CopyOnWriteArrayList),Map的 ConcurrentHashMap(鎖分離,減少鎖競爭),還有隊(duì)列Queue的ConcurrentLinkedQueue(并發(fā)),BlockingQueue(數(shù)據(jù)共享);另外還有Collections提供的一系列synchroniz...方法用于對普通數(shù)據(jù)結(jié)果進(jìn)行線程安全控制。

當(dāng)leader得知人善用,做程序也是一樣。糊里糊涂的隨便new一些數(shù)據(jù)結(jié)構(gòu),卻不清楚初始化這個對象,它的長處與弊端。而處理高并發(fā)大數(shù)據(jù)量系統(tǒng),就得在這些細(xì)節(jié)上花些功夫?;A(chǔ)才是一座城堡屹立不倒的核心。再多的負(fù)載、服務(wù)治理,也得基礎(chǔ)好。

筆者拙見,歡迎斧正。




    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国产又粗又猛又长又黄视频| 人妻内射精品一区二区| 欧美日韩校园春色激情偷拍| 成人精品亚洲欧美日韩| 激情内射日本一区二区三区| 精品香蕉一区二区在线| 国产一区欧美一区日韩一区| 91麻豆视频国产一区二区| 国产又大又黄又粗的黄色| 欧美亚洲另类久久久精品| 国产精品一区欧美二区| 国产成人高清精品尤物| 色偷偷偷拍视频在线观看| 日韩欧美国产精品自拍| 性欧美唯美尤物另类视频| 男人的天堂的视频东京热| 精品一区二区三区免费看| 嫩呦国产一区二区三区av| 日韩人妻中文字幕精品| 欧美日韩国产成人高潮| 老司机精品视频在线免费| 欧美一区二区三区性视频| 东京热男人的天堂久久综合| 亚洲成人精品免费在线观看| 九九热国产这里只有精品| 亚洲国产色婷婷久久精品| 欧美一区二区黑人在线| 高清一区二区三区不卡免费| 国产欧美韩日一区二区三区| 激情偷拍一区二区三区视频| 亚洲一区二区三区免费的视频| 福利一区二区视频在线| 又黄又色又爽又免费的视频| 国产一级二级三级观看| 成人免费视频免费观看| 激情中文字幕在线观看| 我想看亚洲一级黄色录像| 好吊日在线视频免费观看| 欧美精品中文字幕亚洲| 欧美日韩亚洲国产精品| 日韩国产亚洲欧美另类|