Java 并发数据结构

Wesley13
• 阅读 708

[TOCM]

因为Java提供了一些非线程安全的数据结构如HashMap,ArrayList,HashSet等。所有在多线程环境中需要使用支持并发访问操作的数据结构。

并发List

Vector,CopyOnWriteArrayList 是线程安全的List。ArrayList是线程不安全的。如果一定要使用,需要: Collections.synchronizedList(List list) 进行包装。 CopyOnWriteArrayList的内部实现与Vector是不同的,Copy-On-Write就是CopyOnWriteArrayList的内部实现机制。在进行写操作的时候就会复制该对象来操作,读操作直接返回。操作过程中不进行同步。 Vector使用了同步的关键词,所有的get()都必须取得对象锁才能进行。在高并发的时候会有推累系统性能

一般认为读多写少使用CopyOnWriteArrayList。写多读少使用Vector。

并发Set

与List相似,并发的Set也有一个CopyOnWriteSet。内部实现完全依赖CopyOnWriteList。并发写多的情况可以通过 Collections.synchronizedSet(Set set)

并发Map

与List,Set相似也提供了一个 Collections.synchronizedMap(Map map) 创建一个线程安装的Map,但是这个Map并不是性能最佳的。JDK提供一个高并发的Map ConcurrentHashMap。相比通过Collections创建的Map,ConcurrentHashMap 不会锁住整个对象,而是使用锁分离(分块),推荐使用ConcurrentHashMap。

并发Queue

  • ConcurrentLikedQueue
  • BlockingQueue
    • offer(object) 将object放入BlockingQueue里,如果BlockingQueue有充足的空间返回 true,反之 false(该方法不阻塞当前执行的执行方法的线程)
    • offer(E e,long timeout,TimeUnit unit) 可以等待设置的时间。如果在指定的时间都没有添加到Queue就放回失败
    • put(object) 把object放到Queue中。如果空间不够就阻塞调用方法的线程直到有空闲空间才继续
    • pull(time) 取出Queue首位的对象,可以等待指定的时间。超时返回null
    • pull(long timeout,TimeUnit unit) 取出Queue首位的对象,可以等待指定的时间。超时认为失败
    • take() 取走首位对象,若Queue为空,会等到有等数据到来后不在进行堵塞

并发Deque(Double-Ended-Quene)

相比Quene,具有 addFirst(E) addList(E) 等方法,实现相对复杂,实际工作中并没有遇到过就不做介绍了。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
2年前
java16
1:List的子类(掌握)(1)List的子类特点ArrayList:底层数据结构是数组,查询快,增删慢线程不安全,效率高Vector:底层数据结构是数组,查询快,增删慢线程安全,效率低LinkedList:底层数据结构是链表,查询慢,增删快线程不安全,效率高(2)ArrayListA:
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
Java中常见数据结构:List与Map
1:集合Collection(单列集合)List(有序,可重复)ArrayList底层数据结构是数组,查询快,增删慢线程不安全,效率高Vector底层数据结构是数组,查询快,增删慢线程安全,效率低LinkedList底层数据结构是链表,查询慢,增删快线程不安全,效率高Set(无序,唯一)HashSet底层数据结构是哈希表(实际上是
Stella981 Stella981
2年前
BAT面试笔试33题:JavaList、Java Map等经典面试题!
JavaList面试题汇总1、List集合:ArrayList、LinkedList、Vector等。2、Vector是List接口下线程安全的集合。3、List是有序的。4、ArrayList和LinkedList数据结构不一样,前者用在查询较多的场合,后者适用于插入较多的场合。5、ArrayList使用的是
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
35岁是技术人的天花板吗?
35岁是技术人的天花板吗?我非常不认同“35岁现象”,人类没有那么脆弱,人类的智力不会说是35岁之后就停止发展,更不是说35岁之后就没有机会了。马云35岁还在教书,任正非35岁还在工厂上班。为什么技术人员到35岁就应该退役了呢?所以35岁根本就不是一个问题,我今年已经37岁了,我发现我才刚刚找到自己的节奏,刚刚上路。
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这