jdk1.5提供的一個針對高并發(fā)進行編程的包
阻塞式隊列 - BlockingQueue
遵循先進先出(FIFO)原則。阻塞式隊列本身使用的時候是需要指定界限。
ArrayBlockingQueue - 阻塞式順序隊列 - 底層基于數(shù)組來進行存儲,使用的時候需要指定一個容量,容量指定后不可改變 ----常用于生產(chǎn)-消費模型
// 這個隊列在創(chuàng)建的時候需要指定容量,容量在指定之后不可變
ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(5);
// 添加隊列
queue.add("a");
queue.add("b");
queue.add("c");
queue.add("d");
queue.add("e");
// 如果隊列已滿,則拋出異常 - IllegalStateException
// queue.add("a");
// 返回值標記元素是否成功添加到隊列里面
// 如果隊列已滿,則返回false
// boolean b = queue.offer("b");
// System.out.println(b);
// 如果隊列已滿,會產(chǎn)生阻塞 --- 直到這個隊列中有元素被取出,才會放開阻塞
// queue.put("c");
// 定時阻塞
// 在3s之內(nèi)如果有元素被取出,那么元素就會添加到隊列中
// 如果3s之后隊列依然是滿的,那么返回false表示添加失敗
boolean b = queue.offer("d", 3000, TimeUnit.MILLISECONDS);
System.out.println(b);
System.out.println(queue);
ArrayBlockingQueue<String> queue2 = new ArrayBlockingQueue<>(5);
// 隊列為空,拋出異常:NoSuchElementException
// String str = queue2.remove();
// 隊列為空,返回null
// String str = queue2.poll();
// 隊列為空,產(chǎn)生阻塞 - 直到有其他線程向隊列中添加元素,才會放開阻塞
// String str = queue2.take();
// 定時阻塞
String str = queue2.poll(3, TimeUnit.SECONDS);
System.out.println(str);
LinkedBlockingQueue - 阻塞式鏈式隊列 - 底層基于鏈表(節(jié)點來進行數(shù)據(jù)的存儲),在使用時可以指定初始容量,也可以不指定,如果指定了容量,就以指定的容量為準進行存儲,如果不指定容量,那么默認容量是Integer.MAX_VALUE=2^31-1,如果不指定容量,一般認為這個容量是無限的。
PriorityBlockingQueue - 具有優(yōu)先級的阻塞式隊列 - 如果不指定容量默認容量為11 。如果將元素一一取出(只限普通for循環(huán)),那么會對元素進行自然排序--要求存儲的對象所對應(yīng)得類必須實現(xiàn)Comparable,重寫ComparaTo方法指定排序規(guī)則
// @Override
// // 指定比較規(guī)則
// // 如果返回值>0,那么this就要排到o的后邊
// // 如果返回值<0,那么this就要排到o的前邊
// public int compareTo(Student o) {
// return this.age - o.age;
// }
@Override
public int compareTo(Student o) {
return o.score - this.score;
}
SynchronousQueue - 同步隊列 - 只允許存儲一個元素
并發(fā)映射 - ConcurrentMap
HashMap - 底層依靠數(shù)組加鏈表的形式存儲,默認初始容量16,默認加載因子為0.75f、每次擴容增加一倍,本身是一個異步式線程不安全的映射
Hashtable - 同步式線程安全映射 -- 對外提供的都是同步方法。
ConcurrentHashMap - 異步式線程安全的映射 - 在jdk1.8之前,采用分段(分桶)鎖,分段鎖采用的是讀寫鎖的機制(讀鎖:允許多個線程讀,但是不允許線程寫;寫鎖,允許一個線程寫,但是不允許線程讀)
jdk1.8不再采用鎖機制,而是CAS(Compate and Swap)算法,減小了鎖的開銷;
如果一個桶中的元素個數(shù)超過了8個,哪個會將這個桶的鏈表扭轉(zhuǎn)成一顆紅黑樹(自平衡二叉樹的結(jié)構(gòu))