线程粒度因子与锁粒度因子

线程粒度因子与锁粒度因子

在一个有锁保护操作的程序中,每个线程内的计算可以分为如下图所示的几部分:

 
(点击查看大图)图1.6.1:线程内的计算分类

其中

ts - 表示锁内计算时间,大小由共享资源的操作时间决定,与共享资源类型有关,并且与程序员的程序设计有关。

tl - 表示 Lock操作和Unlock操作耗费的时间,如果CPU核的速度固定,那么它为一常量。

tp - 表示锁外可并行计算部分耗费的时间,大小与具体的应用类型及程序员的分解有关

为了形象地表示出各段计算间的比例关系,引入两个概念:线程粒度因子和锁粒度因子。

1. 线程粒度因子

线程粒度因子主要是用来反映一个线程的计算量大小,由 是常量,因此把线程内的有效计算和 的比值叫做线程粒度因子,记为:
     

很显然,理论上线程粒度因子的取值范围为 : 

线程粒度因子的大小与线程内有效计算量 有关,有效计算量越大,那么线程粒度因子就越大,因此线程粒度因子与具体的应用类型和程序员的线程分解方式有关。如果对固定的计算量,分解的线程数量愈多,那么线程粒度因子就愈小。要想使线程粒度因子取得较大的值,必须让线程的数量尽可能的少,当然最少不能小于CPU核数。

通常软件规模是随CPU核数增加而线性增加的,这也意味着对于给定的应用类型,线程粒度因子的最大值为一常量。

2. 锁粒度因子

锁粒度因子反映了一个线程内锁操作的粒度关系,用锁内计算和 的比值来表示锁粒度因子,记为:

 

很显然,锁粒度因子的取值范围为 :

将粒度非常小的锁叫做细粒度锁,细粒度锁是一个比较重要的概念,在以前的单核多线程编程中,采用细粒度锁可以取得很好的分时效果;在多核编程时,细粒度锁更重要了,它不仅可以取得分时效果,还可以使加速比性能得到大大提升,这一点在随后的锁竞争中的加速比分析中会给出详细描述。

锁粒度因子的大小取决于锁内计算的大小,因此要想使锁粒度变小就必须减少锁内计算量。锁内计算的大小是受共享资源的操作时间和锁内非共享资源操作时间决定的,因此可以从以下两个方面来减少锁粒度因子:

将非共享资源操作从锁内移到锁外

将大的共享资源操作设计成小的共享资源操作减少共享资源操作时间

共享资源的操作时间与共享资源类型有关。在固定的应用类型中,锁粒度因子的最小值可以看成是常数。

### ConcurrentHashMap 的初始容量、扩容机制及负载因子解释 #### 初始容量设置 `ConcurrentHashMap` 的初始容量是指在创建实例时指定的预计键值对数量。通过构造函数可以显式地设定初始容量,这有助于减少动态调整大小所需的开销。如果未提供初始容量,则会采用默认值 `16` 作为初始桶数组的大小[^1]。 ```java // 创建一个具有指定初始容量和加载因子的 ConcurrentHashMap 实例 public ConcurrentHashMap(int initialCapacity, float loadFactor); ``` #### 扩容机制详解 当存储的键值对数目超过某个阈值时,`ConcurrentHashMap` 将触发扩容操作。此过程涉及以下几个方面: - **分段锁设计** 不同于传统的 `HashMap` 使用单一锁来保护整个表,在多线程环境下性能较差;而 `ConcurrentHashMap` 引入了分段锁的概念(Segment),从而允许多个线程同时访问不同的 Segment 数据结构部分而不互相干扰[^2]。 - **迁移策略** 在执行扩容期间,原有的数据会被重新分配到新的更大的散列表中去。为了提高效率并降低阻塞时间长度,采用了渐进式的转移方法——即每次只处理一小批条目而不是一次性完成全部工作项。 - **CAS 和 synchronized 配合使用** 对某些关键区域应用细粒度锁定技术 (synchronized),而在其他地方尽可能依赖无锁算法比如 Compare-And-Swap(CAS) 来实现高效且低延迟的操作体验。 #### 负载因子作用说明 负载因子定义了一个 map 可以填充其内部 bucket 数组之前的比例界限,默认情况下该参数被设为0.75f 。这意味着每当实际占用空间达到理论最大容量 * 负载因子之后就会启动扩展动作。较低数值意味着更少冲突但更多内存消耗; 较高则反之。 综上所述,合理配置这些属性可以帮助开发者优化程序运行表现,特别是在高度竞争环境中尤为如此。 ```java // 示例代码展示如何自定义初始化参数 ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>(16, 0.75f, 4); // 参数分别为initialCapacity(初始容量),loadFactor(装载因子),concurrencyLevel(预期的最大并发级别) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值