Java线程安全容器

一、Java同步容器

  同步容器是用来解决并发情况下的容器线程安全问题的。给多线程环境准备一个线程安全的容器对象。

  线程安全的容器对象: Vector, Hashtable。线程安全容器对象,都是使用synchronized方法实现的。

  concurrent包中的同步容器,大多数是使用系统底层技术实现的线程安全。类似native。Java8中使用CAS。

二、Map/Set

1,ConcurrentHashMap/ConcurrentHashSet

  底层哈希实现的同步Map(Set)。效率高,线程安全。使用系统底层技术实现线程安全。量级较synchronized低。key和value不能为null。

2,ConcurrentSkipListMap/ConcurrentSkipListSet

  底层跳表(SkipList)实现的同步Map(Set)。有序,效率比ConcurrentHashMap稍低。

三、List

1,CopyOnWriteArrayList

  写时复制集合。写入效率低,读取效率高。每次写入数据,都会创建一个新的底层数组。

四、Queue

1,ConcurrentLinkedQueue

  基础链表同步队列。

2,LinkedBlockingQueue

  阻塞队列,队列容量不足自动阻塞,队列容量为0自动阻塞。

3,ArrayBlockingQueue

  底层数组实现的有界队列。自动阻塞。根据调用API(add/put/offer)不同,有不同特性。

  当容量不足的时候,有阻塞能力。

  add方法在容量不足的时候,抛出异常。

  put方法在容量不足的时候,阻塞等待。

  单参数offer方法,不阻塞。容量不足的时候,返回false。当前新增数据操作放弃。

  三参数offer方法(offer(value,times,timeunit)),容量不足的时候,阻塞times时长(单位为timeunit),如果在阻塞时长内,有容量空闲,新增数据返回true。如果阻塞时长范围内,无容量空闲,放弃新增数据,返回false。

4,DelayQueue

  延时队列。根据比较机制,实现自定义处理顺序的队列。常用于定时任务。如:定时关机。

5,LinkedTransferQueue

  转移队列,使用transfer方法,实现数据的即时处理。没有消费者,就阻塞。

6,SynchronusQueue

  同步队列,是一个容量为0的队列。是一个特殊的TransferQueue。

  必须现有消费线程等待,才能使用的队列。

  add方法,无阻塞。若没有消费线程阻塞等待数据,则抛出异常。

  put方法,有阻塞。若没有消费线程阻塞等待数据,则阻塞。

原文地址:https://www.cnblogs.com/guanghe/p/10648333.html

时间: 2024-10-12 05:32:41

Java线程安全容器的相关文章

Java线程同步类容器和并发容器(四)

同步类容器都是线程安全的,在某些场景下,需要枷锁保护符合操作,最经典ConcurrentModifiicationException,原因是当容器迭代的过程中,被并发的修改了内容. for (Iterator iterator = tickets.iterator(); iterator.hasNext();) { String string = (String) iterator.next(); tickets.remove(20); } //多线程使用Vector或者HashTable的示例

java中的容器解释

解释一:容器(Container)Spring 提供容器功能,容器可以管理对象的生命周期.对象与对象之间的依赖关系,您可以使用一个配置文件(通常是XML),在上面定义好对象的名称.如何产生(Prototype 方式或Singleton 方式).哪个对象产生之后必须设定成为某个对象的属性等,在启动容器之后,所有的对象都可以直接取用,不用编写任何一行程序代码来产生对象,或是建立对象与对象之间的依赖关系.换个更直白点的说明方式:容器是一个Java 所编写的程序,原先必须自行编写程序以管理对象关系,现在

转:java多线程--同步容器

java同步容器 在Java的集合容器框架中,主要有四大类别:List.Set.Queue.Map.List.Set.Queue接口分别继承了Collection接口,Map本身是一个接口.注意Collection和Map是一个顶层接口,而List.Set.Queue则继承了Collection接口,分别代表数组.集合和队列这三大类容器.像ArrayList.LinkedList.HashMap这些容器都是非线程安全的.因此,在编写程序时,必须要求程序员手动地在任何访问到这些容器的地方进行同步处

JAVA 持有对象——容器初探

引言 如果一个程序只包含固定数量的且其生命周期都是已知对象,那么这是一个非常简单的程序--<think in java> 了解容器前,先提出一个问题,ArrayList和LinkedList谁的处理速度更快呢? 一 持有对象的方式 在Java中,我们可以使用数组来保存一组对象.但是,数组是固定大小的,在一般情况下,我们写程序时并不知道将需要多少个对象,因此数组固定大小对于编程有些受限. java类库中提供了一套相当完整的容器类来解决这个问题,其中基本类型有List,Queue,Set,Map,

Java线程池与java.util.concurrent

Java(Android)线程池 介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }).start(); 那你就out太多了,new Thre

Java集合(一)—容器了解

Java集合(一)-容器了解 一:集合框架 Java集合框架图 Java集合简化图 二:添加一组元素 在Java集合中的工具包中(Arrays,Collections)如上图所示,添加一组元素可以采用: Arrays.asList(args) args:数组或逗号分隔的列表 将结果转换为一个list对象(不能直接对其操作底层返回的仍是数组) Collection.addAll(args) args:只能是collection集合 (不灵活 ) Collections.addAll(arg0 ,

java线程:单例隐藏ThreadLocal实现线程数据共享

问题: 给定的二叉查找树中,有两个节点不小心被调换了位置,现在需要将其修正,不改变树的结构. 分析: 二叉排序树的中序遍历是有序的,所以这个问题又是建立在中序遍历模板上的问题,所以我们可以对其进行中序遍历,并用一个pre指针指向当前遍历结果中的最后一个结点,即下次遍历前的前一个结点.然后就可以通过将当前结点与pre结点进行比较,来判断是否有序了.若乱序,就将这两个结点都放入到预先定义的容器中. 错误的形式就这两种,我们看到,在乱序容器中,最多就存了四个元素,所以空间复杂度还是满足O(n)的,当然

2018 Java线程热门面试题,你知道多少?

面试,难还是不难?取决于面试者的底蕴(气场+技能).心态和认知及沟通技巧.面试其实可以理解为一场聊天和谈判,在这过程中有心理.思想上的碰撞和博弈.其实你只需要搞清楚一个逻辑:"面试官为什么会这样问?他希望听到什么答案?"然后针对性的准备和回答就行了,无他. 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发

Java线程面试题合集(含答案)

来源:Java线程面试题 下面是我自己收集整理的Java线程相关的面试题,可以用它来好好准备面试. 参考文档: <Java核心技术 卷一> Java线程面试题 Top 50:http://www.importnew.com/12773.html JAVA多线程和并发基础面试问答: http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-answers/ 15个顶级Java多线程面试题及回答:http: