5-基础构建模块

简介: 5-基础构建模块

1 同步容器类

同步容器类包括Vector和HashTable,二者是早期JDK一部分,此外还包括在JDK 1.2中添加的一些功能相似的类,这些的同步封装器类是由Collections.synchronizedXxx等工厂方法创建的。这些类实现线程安全的方式是:将他们的状态封装起来,并对每个共有方法进行同步,使得每次只有一个线程能访问容器的状态。

1.1 同步容器类的问题

同步容器类都是线程安全的,但在某些情况可能需额外客户端加锁来保护复合操作。

容器上常见的复合操作包括:


  • 迭代(反复访问元素,直到遍历完容器中所有元素)
  • 跳转(根据指定顺序找到当前元素的下一个元素)以及条件运算

在同步容器类中,这些复合操作在没有客户端加锁的情况下,仍是线程安全的,

但当其他线程并发的修改容器时,他们可能会表现出意料之外的行为。

2 并发容器

Java5提供了多种并发容器来改进同步容器的性能。

同步容器将所有对容器状态的访问都串行化,以实现他们的线程安全性。

这种方法的代价是严重降低并发性,当多个线程竞争容器的锁时,吞吐量将严重降低。

并发容器是针对多个线程并发访问设计的。在Java 5中增加了


  • ConcurrentHashMap,用来替代同步且基于散列的Map,增加了对一些常见符合操作的支持,例如“若没有则添加”、替换以及有条件删除等。
  • CopyOnWriteArrayList,用于在遍历操作为主要操作的情况下代替同步的List。


通过并发容器来代替同步容器,可以极大地提供伸缩性并降低风险。


2.1 CocurrentHashMap

同步容器在执行每个操作期间都持有一个锁。在一些操作中,例如HashMashMap.get或List.contains,可能包含大量的工作:当遍历散列桶或链表来查找某个特定的对象时,必须在许多元素上调用equals。在基于散列的容器中,如果hashCode不能很均匀的分布散列值,那么容器中的元素就不会均匀的分布在整个容器中。某些情况下,某个糟糕的散列函数还会把一个散列表变成线性链表。当遍历很长的链表并且在某些或者全部元素上调用equals方法时,会花费很长时间,而其他线程在这段时间内都不能访问容器。


ConcurrentHashMap使用一种粒度更细的称为分段锁的机制来实现更大程度的共享.

在这种机制中,任意数量的读取线程可以并发的访问Map,执行读操作的线程和执行写操作的线程可以并发的访问Map,并且一定数量的写线程可以并发的修改Map.


ConcurrentHashMap与其他并发容器一起增强了同步容器:迭代器不会抛出ConcurrentModificationException,因此迭代过程无需加锁.

其迭代器具有”弱一致性”,而并非”及时失败”.可以容忍并发的修改,当创建迭代器时会遍历已有的元素,并可以(但不保证)在迭代器被构造后将修改操作反映给容器.


只有当需要加锁Map以进行独占访问时,才应该放弃使用ConcurrentHashMap.

2.2 额外的原子Map操作

由于ConcurrentHashMap不能被加锁来执行独占访问,因此 无法使用客户端加锁来创建新的原子操作.

一些常见的复合操作,eg.”若没有则添加”,”若相等则移除”等,都已经实现为原子操作并且在ConcurrentMap接口中声明,如下面代码所示.

public interface ConcurrentMap<K, V> extends Map<K, V> {
     //仅当K没有相应的映射值时才插入
     V putIfAbsent(K key, V value);
     //仅当K被映射到V时才移除
     boolean remove(Object key, Object value);
     //仅当K被映射到oldValue时才替换为newValue
     boolean replace(K key, V oldValue, V newValue);
     //仅当K被映射到某个值时才被替换为newValue
      V replace(K key, V value);
}
目录
相关文章
|
7月前
|
Python
理解模块功能
理解模块功能
83 8
|
7月前
|
资源调度 前端开发 JavaScript
构建高效前端项目:现代包管理器与模块化的深度解析
【2月更文挑战第21天】 在当今快速演变的前端开发领域,高效的项目管理和代码组织已成为成功交付复杂Web应用的关键。本文将深入探讨现代前端包管理器如npm, yarn和pnpm的工作原理,以及它们如何与模块化编程实践(例如CommonJS、ES6模块)协同工作以优化开发流程。我们将剖析这些工具的内部机制,了解它们如何解决依赖冲突,提高安装速度,并保证项目的健壮性。同时,本文还将介绍模块化编程的最佳实践,包括代码拆分、重用和版本控制,帮助开发者构建可维护且性能卓越的前端项目。
|
6月前
|
XML JavaScript Java
技术经验分享:Asea——轻量级的AS3模块配置与加载管理库
技术经验分享:Asea——轻量级的AS3模块配置与加载管理库
45 0
|
2月前
|
JSON 前端开发 JavaScript
前端模块打包器的深度解析
【10月更文挑战第13天】前端模块打包器的深度解析
|
5月前
|
消息中间件 JSON 数据安全/隐私保护
`kombu`模块简介
`kombu`模块简介
|
6月前
|
Linux 测试技术 iOS开发
Meson:现代的构建系统
Meson:现代的构建系统
187 0
|
7月前
|
编译器 API PHP
深入PHP扩展开发:打造高效自定义模块
【4月更文挑战第30天】 在追求性能优化和特定功能实现的道路上,PHP提供了一种强大机制——扩展。本文将引导读者通过编写一个简单的PHP扩展来探索扩展开发的世界。我们将涉及从环境搭建到代码实现,再到扩展的编译与加载的完整流程,确保读者能够理解并实践如何创建高效的自定义PHP模块。
|
7月前
|
人工智能 大数据 5G
400G光模块已经部署,需求将进一步扩大
2023年底,电信运营商完成400G OTN试验网设备部署,标志着400G技术大规模部署的开端。400G传输技术日趋成熟,预计2024年实现长距离商用。400G光模块在提升数据传输效率、降低能耗方面发挥关键作用,适应云计算、大数据、AI对高效算力的需求。光纤技术行业显现复苏态势,400G光模块部署成为数据中心发展的必然,支持新兴技术发展。随着5G、云计算等技术进步,对高速光模块需求激增,推动光纤行业创新与市场扩张。
79 2
|
数据采集 算法 数据可视化
MMdetection框架速成系列 第03部分:简述整体构建细节与模块+训练测试模块流程剖析+深入解析代码模块与核心实现
按照抽象到具体方式,从多个层次进行训练和测试流程深入解析,从最抽象层讲起,到最后核心代码实现,希望帮助大家更容易理解 MMDetection 开源框架整体构建细节
612 0
|
Java 数据库
项目的模块以及每一个模块的作用
项目的模块以及每一个模块的作用
项目的模块以及每一个模块的作用