java 并发数据结构_Java 并发数据结构

[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) 等方法,实现相对复杂,实际工作中并没有遇到过就不做介绍了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值