多线程并发锁,优化过程


系统公共模块重复读取数据库,如:产品分类导航。使用简单代码模拟缓存方式。

经过三次修改优化过程,方便小伙伴阅读。


一、增加缓存方法:

 
二、经测试,方法同步,造成锁粒度过大,优化如下:

 
三、synchronized 如存在并发,导致多次初始化。
改为Lock,二次判断,并发初始化时排队机制,后者线程可避免初始化。

 


### 如何优化多线程并发程序的性能 #### 使用合适的线程数 为了充分发挥多核 CPU 的优势并减少资源竞争,应合理设置线程数量。通常情况下,线程的数量可以根据硬件的核心数进行调整。如果线程过多,则可能导致上下文切换频繁,从而降低效率;而线程过少则可能无法完全利用可用核心[^2]。 #### 减少的竞争 在多线程环境中,过度依赖同步机制(如 `lock` 或互斥量)可能会成为瓶颈。可以通过以下方法减少的影响: - **细粒度定**:仅对必要的数据结构加,而不是整个操作过程。 - **无算法**:对于某些场景,可以采用原子操作或其他无技术替代传统。 - **读写**:当存在大量只读访问时,可考虑使用读写以提高吞吐量[^1]。 #### 避免死与活现象 设计良好的通信协议能够有效预防死的发生。另外还需注意防止出现活情况——即各线程不断尝试重新执行因冲突失败的操作却始终未能成功完成任何实际进展的情形[^4]。 #### 利用现代库和框架 许多高级别的编程语言已经内置支持高效管理多线程的功能模块。例如,在 Python 中除了基础 threading 模块外还有 concurrent.futures 等更易使用的接口可以帮助简化开发流程并提升应用表现。 以下是基于上述原则的一个简单实现例子: ```python import concurrent.futures import time def task(n): """模拟耗时任务""" print(f'Starting {n}') time.sleep(2) result = n * n print(f'Finished {n}: Result={result}') return result if __name__ == '__main__': with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor: futures = [executor.submit(task, i) for i in range(10)] results = [] for future in concurrent.futures.as_completed(futures): try: res = future.result() results.append(res) except Exception as exc: print('Task generated an exception:', exc) print("All tasks completed:", results) ``` 此脚本展示了如何通过 ThreadPoolExecutor 来控制最大工作线程数目以及异步获取各个子任务的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值