list實(shí)現(xiàn)類說明
// hashMap特點(diǎn)是數(shù)組+鏈表擒权,當(dāng)鏈表長度=8的時(shí)候,鏈表會(huì)拓展成紅黑樹
// 數(shù)組長度為2的倍數(shù)锨亏,默認(rèn)長度是16备籽,加載因子是0.75
Map<String, String> map2 = new HashMap<>();
// concurrentmap特點(diǎn)是數(shù)組+鏈表怒见,當(dāng)鏈表長度=8的時(shí)候,會(huì)拓展成紅黑樹;并發(fā)的時(shí)候并非全局上鎖兔沃,
//而是鎖鏈表的頭結(jié)點(diǎn)橄碾,使用synchronized
// 數(shù)組長度為2的倍數(shù)
Map<String, String> map = new ConcurrentHashMap<>(10);
// 存儲(chǔ)方式是數(shù)組卵沉、通過modcount判斷是否被修改、
//擴(kuò)容方式是system.arraycory法牲,每次擴(kuò)容是上一次的1.5倍
List<String> list = new ArrayList<String>();
// 鏈表結(jié)構(gòu)史汗,查詢時(shí)候會(huì)判斷index在上半截還是下半截,如果是下半截拒垃,那就從尾部開始往前查找
// 雖然繼承deque停撞,但是不是雙向鏈表結(jié)構(gòu)
// 也是通過modcount來判斷是否被修改過
List<String> linklist = new LinkedList<>();
// 并發(fā)鏈表,鏈表結(jié)構(gòu)悼瓮,通過for+cas的方式更新節(jié)點(diǎn)戈毒。size的長度是通過遍歷鏈表得來的。
// 新增節(jié)點(diǎn)的時(shí)候横堡,先修改tail節(jié)點(diǎn)的next埋市,然后判斷tail != next的時(shí)候才更新tail命贴,(延遲更新恐疲,提升效率)
// 所以1.tail并不是真正意義上面的最后節(jié)點(diǎn) 2.分開更新提供了效率,
//因?yàn)椴l(fā)情況下更新tail的次數(shù)更小了腊满。這里使用的是weakCompareAndSet(可能原子性更新)
ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<String>();
queue實(shí)現(xiàn)類說明
// 數(shù)組結(jié)構(gòu)的有界阻塞隊(duì)列,線程安全類
// 使用reentrantlock實(shí)現(xiàn)全局方法加鎖,只有一把鎖
// 和兩個(gè)condition實(shí)現(xiàn)put和task的阻塞,可以使用公平和非公平鎖培己,默認(rèn)是非公平
BlockingQueue blockQueue = new ArrayBlockingQueue<String>(10);
// 鏈表結(jié)構(gòu)的有界阻塞隊(duì)列
// 使用兩把reentrantlock鎖碳蛋,一把put鎖,一把task鎖省咨。
// 所有寫入方法都要先獲取put鎖肃弟,所有刪除數(shù)據(jù)都要先獲取task鎖。
// 隊(duì)列的元素個(gè)數(shù)使用atmoicinteger記錄零蓉,
//寫入的時(shí)候判斷元素個(gè)數(shù)是否等于隊(duì)列容量笤受,是的則使用put鎖的condition.await阻塞方法,
// 寫入成功之后判斷當(dāng)前隊(duì)列元素個(gè)數(shù)+1小于容量就喚醒一個(gè)鎖
// 所有獲取元素都要先獲取task鎖,然后判斷當(dāng)前隊(duì)列容量等于0則是使用task鎖的condition.await阻塞線程
// 成功獲取元素之后敌蜂,判斷當(dāng)前隊(duì)列元素個(gè)數(shù)是否大于1箩兽,大于則喚醒一個(gè)線程
// 使用atomicinteger原子性更新隊(duì)列元素個(gè)數(shù)
// remove,contains,toArray,clear,獲取iterator(next方法)等都要先獲取put和task鎖
blockQueue = new LinkedBlockingQueue<String>(10);
// 一個(gè)支持優(yōu)先級排序的無界隊(duì)列
// 數(shù)組方式存儲(chǔ),默認(rèn)長度是8章喉,最大嘗試是integer.max_value - 8
// 一把reentrantlock鎖汗贫,針對所有publie方法
// 回頭來看priorityqueue隊(duì)列吧
// PriorityBlockingQueue是一個(gè)無界隊(duì)列,擴(kuò)容方式是容量小于64的時(shí)候秸脱,
// 擴(kuò)容每次+2落包,超過64的時(shí)候,每次擴(kuò)容1.5倍
// 當(dāng)容量滿的時(shí)候摊唇,put沒有阻塞咐蝇,而是擴(kuò)容
// 當(dāng)容量等于=0的時(shí)候,task會(huì)阻塞巷查。
blockQueue = new PriorityBlockingQueue<String>();
// 一個(gè)使用優(yōu)先級隊(duì)列實(shí)現(xiàn)的延遲無界隊(duì)列
// 使用reentrantlock一把鎖
// 寫入的對象需要實(shí)現(xiàn)Delayed接口類有序,也是使用priorityqueue隊(duì)列
// 寫入的時(shí)候,包括put都使用offer方法岛请,不阻塞寫入
// 讀取的時(shí)候task會(huì)阻塞旭寿,結(jié)合priorityqueue和獲取第一個(gè)元素,
// 判斷時(shí)間是否大于等于設(shè)置的運(yùn)行時(shí)間髓需,如果是則返回,否則阻塞線程
blockQueue = new DelayQueue<MyDelay>();
// 一個(gè)不存儲(chǔ)元素的阻塞隊(duì)列
// 內(nèi)部使用公平和非公平傳輸方式房蝉,公平就是先進(jìn)先出僚匆,非公平就是后進(jìn)先出
// 使用for循環(huán)+cas的方式,寫入數(shù)據(jù)搭幻。查詢數(shù)據(jù)一樣咧擂,其實(shí)他們都是使用同一個(gè)底層方法,for+cas對head的寫入檀蹋。寫入是寫入具體snode值松申,讀取是寫入null值
blockQueue = new SynchronousQueue<String>();
// 一個(gè)由鏈表結(jié)構(gòu)組成的無界隊(duì)列
// for+cas方式寫入
// 多了tryTransfer和transfer方法云芦,如果當(dāng)前有消費(fèi)者正在等待接受元素,transfer則把生產(chǎn)者傳入的元素立即給消費(fèi)者贸桶。
// 如果沒有消費(fèi)在等待元素舅逸,transfer會(huì)把元素放入tail節(jié)點(diǎn),并等待該元素被消費(fèi)才返回皇筛。
// tryTransfer是無論消費(fèi)者是否接受琉历,立刻返回
// 這里面的說明好像不對
blockQueue = new LinkedTransferQueue<String>();
// 一個(gè)由鏈表組成的雙向阻塞隊(duì)列
// 一把reentrantlock鎖,兩個(gè)condition水醋,最大長度為integer.max_value
blockQueue = new LinkedBlockingDeque<String>();
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者