线程相关类

本文包含:

  1. ThreadLocal 类
  2. 包装线程不安全的集合
  3. 线程安全的集合类

1. ThreadLocal 类

在这里插入图片描述
ThreadLocal 类的用法非常简单,它只提供如下三个 public 方法:
在这里插入图片描述在这里插入图片描述
ThreadLocal 并不能替代同步机制,两者面向的问题不同。同步机制是为了同步多个线程对相同资源的并发访问,是多个线程之间进行通信的有效方式;而 ThreadLocal 是为了隔离多个线程的数据共享,从根本上避免多个线程之间对共享资源的竞争,也就不需要对多个线程进行同步了。

通常建议:如果多个线程之间需要共享资源,以达到线程之间的通信功能,就使用同步机制;如果仅仅需要隔离多个线程之间的共享冲突,则可以使用 ThreadLocal。

2. 包装线程不安全的集合

前面介绍Java 集合时所讲的 ArrayList、Linkedlist、HashSet、TreeSet、HashMap、TreeMap 等都是线程不安全的,也就是说,当多个并发线程向这些集合中存、取元素时,就可能会破坏这些集合的数据完整性。
如果程序中有多个线程可能访问以上这些集合,就可以使用 Collections 提供的类方法把这些集合包装成线程安全的集合。Collections 提供了如下几个静态方法:
在这里插入图片描述
例如需要在多线程中使用线程安全的 HashMap 对象,则可以采用如下代码:
在这里插入图片描述
如果需要把某个集合包装成线程安全的集合,则应该在创建之后立即包装,如上程序所示—当 HashMap 对象创建后立即被包装成线程安全的 HashMap 对象。

3. 线程安全的集合类

在 java.util.concurrent 包下提供了大量支持高效并发访问的集合接口和实现类
在这里插入图片描述
从上图可以看出,这些线程安全集合类可分为如下两类:
在这里插入图片描述
其中以 Concurrent 开头的集合类
在默认情况下,ConcurrentHashMap 支持 16 个线程并发写入,当有超过16 个线程并发向该 Map 中写入数据时,可能有一些线程需要等待。实际上,程序通过设置 concurrencyLevel 构造参数(默认值为 16)来支持更多的并发写入线程。

与前面介绍的 HashMap 和普通集合不同的是,因为 ConcurrentLinkedQueue 和 ConcurrentHashMap 支持多线程并发访问,所以当使用迭代器来遍历集合元素时,该迭代器可能不能反映出创建迭代器之后所做的修改,但程序不会抛出异常。

Java 8 扩展了ConcurrentHashMap 的功能,Java 8 为该类新增了很多可借助于 Stream 和 Lambda 表达式支持执行聚集操作。
ConCurrentHashMap 新增的方法大致可分为如下三类:
在这里插入图片描述
除此之外,ConcurrentHashMap 还新增了 mappingCount()、newKeySet() 等方法,增强后的 ConcurrentHashMap 更适合作为缓存实现类使用。

使用 java.util 包下的Collection 作为集合对象时,如果该集合对象创建迭代器后集合元素发生改变,则会引发 ConcurrentModificationException 异常。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值