JDK 中有哪些同步容器?并发容器?

网友投稿 517 2022-11-17

JDK 中有哪些同步容器?并发容器?

JDK 中有哪些同步容器?并发容器?

JDK 1.5 之前同步容器包括:

Vector、Hashtable、StackCollections 工具类将普通容器,转变为同步容器,如:

public static Collection synchronizedCollection(Collection c)public static Set synchronizedSet(Set s)public static List synchronizedList(List list)public static Map synchronizedMap(Map m)

同步容器的实现原理就是在容器的操作方法上,加上了 synchronized 关键字。

List:CopyOnWriteArrayList

Set:CopyOnWriteArraySet、ConcurrentSkipListSetMap:ConcurrentHashMap、ConcurrentSkipListMapQueue:阻塞队列名称用 Blocking 标识,单端队列名称用 Queue 标识,双端队列名称用 Deque 标识

单端阻塞队列:ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、LinkedTransferQueue、PriorityBlockingQueue、DelayQueue双端阻塞队列:LinkedBlockingDeque单端非阻塞队列:ConcurrentLinkedQueue双端非阻塞队列:ConcurrentLinkedDeque

下面示例中,当不把 list 转变为同步容器,并发 add,最后主线程打印 list,可能会报 java.util.ConcurrentModificationException 和 java.lang.ArrayIndexOutOfBoundsException,去掉注释就可以并发新增元素(当然最后打印的 list 不一定是元素的情况)

package constxiong.interview;import java.util.ArrayList;import java.util.Collections;import java.util.List;/** * 测试 同步容器与并发容器 * @author ConstXiong * @date 2019-12-26 20:56:32 */public class TestSynchronizedAndConcurrentCollection { static List list = new ArrayList(); public static void main(String[] args) throws InterruptedException { testSynchronizedCollection(); } /** * 测试同步容器 * @throws InterruptedException */ private static void testSynchronizedCollection() throws InterruptedException {// list = Collections.synchronizedList(list); for (int i = 0; i < 300; i++) { final int index = i; new Thread(() -> { list.add(index); }).start(); } System.out.println(list); } }

并发容器的使用很简单,跟普通容器类似,如:

/** * 测试并发容器 */ private static void testConcurrentCollection() { for (int i = 0; i < 300; i++) { final int index = i; new Thread(() -> { map.put(index, index); }).start(); } System.out.println(map); }

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:MySQl的绑定变量特性
下一篇:k8s externaltrafficpolicy相关说明
相关文章

 发表评论

暂时没有评论,来抢沙发吧~