java容器中 哪些是线程安全的
容器中线程安全的如:vectory,hashtable,非线程安全的如:hashmap,arrylist等。
对于原定义非线程的容器如:hashmap,arraylist可以使用Collections中的synchronizedList(list),synchronizedMap(map),synchronizedSet(set)等方法来使原来非线程安全的容器编程线程安全。
一、Hashtable 和 Vector
线程安全的容器对象: Vector, Hashtable。线程安全容器对象,都是使用synchronized方法实现的。
java.util.concurrent包中的同步容器,大多数是使用系统底层技术实现的线程安全。类似native。Java8中使用CAS。
二、 Concurrent包中的类
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方法,有阻塞。若没有消费线程阻塞等待数据,则阻塞。
java容器中 哪些是线程安全的的更多相关文章
- 迭代器模式在 Java 容器中的实现
迭代器接口是迭代器模式实现的精髓: public interface Iterator<E> { boolean hasNext(); E next(); ... } 假设某容器名为 Xx ...
- 设计模式学习笔记(十六)迭代器模式及其在Java 容器中的应用
迭代器(Iterator)模式,也叫做游标(Cursor)模式.我们知道,在Java 容器中,为了提高容器遍历的方便性,把遍历逻辑从不同类型的集合类中抽取出来,避免向外部暴露集合容器的内部结构. 一. ...
- 【Java心得总结六】Java容器中——Collection
在[Java心得总结五]Java容器上——容器初探这篇博文中,我对Java容器类库从一个整体的偏向于宏观的角度初步认识了Java容器类库.而在这篇博文中,我想着重对容器类库中的Collection容器 ...
- Java面试中的“劲敌”线程,9个疑问全面解析
作者:我是攻城师 (一)创建线程的方式 (1)实现Runnable接口 (2)继承Thread类 推荐使用接口,能够做到定义与实现分离,耦合更低 (二)关于线程的优先级 thread2.setPrio ...
- java方法中开启一个线程
很多业务场景下需要你在一个方法中去开启一个线程,去跑一些处理时间较长的代码,这样调用方就不必经过长时间的等待了.好了 话不多说 先上代码: package test; public class Th ...
- 面试必问!Java 多线程中两个线程交替执行,一个输出偶数,一个输出奇数
前言 楼主今天在面经上看到这个题,挺有意思,小小的题目对多线程的考量还挺多.大部分同学都会使用 synchronized 来实现.楼主今天带来另外两种优化实现,让你面试的时候,傲视群雄! 第一种 sy ...
- Java容器中的元素输出
1.容器不同于数组,容器若是想输出全部元素,可以直接利用System.out.println(collection) public class TestCollectionArrayPrint { p ...
- 容器中的Java堆大小调整:快速,轻松
在上一篇博客中,我们已经看到Java进行了改进,可以根据正在运行的环境(即物理机或容器(码头工人))识别内存.java的最初问题是,它无法弄清楚它是否在容器中运行,并且它曾经为容器运行所在的整个硬件捕 ...
- 【Java心得总结七】Java容器下——Map
我将容器类库自己平时编程及看书的感受总结成了三篇博文,前两篇分别是:[Java心得总结五]Java容器上——容器初探和[Java心得总结六]Java容器中——Collection,第一篇从宏观整体的角 ...
随机推荐
- 百度小程序-map组件定位
给客户开发一个百度小程序,有个地图定位显示.百度小程序内置的api地图是不准的,通过百度一下,查询到坐标偏移算法公式,自己项目中使用,手机测试坐标已经正常显示! 经纬度,通过百度坐标拾取器拾取到! . ...
- objc_setAssociatedObject 关联对象
使用场景:在分类中,不允许创建实例变量,这里就解决了此问题 参考: https://www.cnblogs.com/someonelikeyou/p/7162613.html 属性的实质:就是实例变量 ...
- ldd3 编写scull尝试
快速参考: #include <linux/types.h> dev_t dev_t is the type used to represent device numbers within ...
- CSS中的flex布局
1.flex 布局的概念 Flex是Flexible Box的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性.任何一个容器都可以指定为 Flex 布局,行内元素也可以通过 ...
- spring boot 修改banner
在resources目录下新建一个banner.txt,里面添加要显示的内容,如: ////////////////////////////////////////////////////////// ...
- pip install 报SSL异常和timeout异常
在安装pip3 install virtualenv时报了SSL异常 如图 pip is configured with locations that require TLS/SSL, however ...
- python- ' % '运算符的用途(非常重要)
%运算符就是用来格式化字符串的. 在字符串内部, %s表示用字符串替换, %d表示用整数替换, 有几个%?占位符,后面就跟几个变量或者值,顺序要对应好. 如果只有一个%?,括号可以省略. 另一种格式化 ...
- 数据结构C语言实现
顺序表实现 typedef int Position; typedef struct LNode *List; struct LNode { ElementType Data[MAXSIZE]; Po ...
- C语言|博客作业3
问题 答案 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://i.cnblogs.com/EditPosts.aspx?postid=11661995&update ...
- 异步请求jquery
//校验资费名是否重复 function check_name(){ var name=$("#name").val(); //校验资费名是否为空 if(name=="& ...