并发场景加锁优化小技巧

简介: 在 JDK 中有很多锁,包括 synchronized、ReentrantLock、ReentrantReadWriteLock、锁的使用场景也分很多种,下面看一下对加锁优化的小技巧。

前言


在 JDK 中有很多锁,包括 synchronized、ReentrantLock、ReentrantReadWriteLock、锁的使用场景也分很多种,下面看一下对加锁优化的小技巧。

以下内容为个人学习笔记。


并发修改标志位

优先使用 volatile;

比如分布式服务注册中心的优雅停机,因为 volatile 就可以保证可见性。而不必使用 synchronized


数值递增

优先使用 Atomic 原子类;

CAS 无锁化操作,比如分布式服务注册中心的心跳次数维护;


维护线程副本

使用 ThreadLocal

在分布式存储系统使用 ThreadLocal 维护每个线程自己的 txid。


读多写少

使用读写锁 ReentrantReadWriteLock。

比如分布式服务注册中心的服务注册表注册和读取。


尽量减少锁占用时间

加锁范围尽量小,加锁时只操作内存数据,对数据库、磁盘 IO 操作最好不要使用锁。

比如分布式存储是通 edits log 的分段加锁机制。


尽可能减少对数据加锁的力度,分段锁

一份数据包含多个子数据时,对子数据分开加锁,用来替换对整个大的数据进行加锁。

比如库存可以创建多个子库存,对子库存进行加锁,总库存=各个子库存的总和,可以参考 LongAdder。


对不同的功能分开加锁

比如同步队列 LinkedBlockingQueue。

入队出队分开加锁


避免在循环中使用锁

在循环中使用锁,会导致锁竞争频繁,避免自旋。

如果在循环中使用,可以参考 AQS,使用 LockSupport park 阻塞,释放资源,然后上一个节点 unpark 下一个节点,这种机制。


减少高并发场景对锁的争用,使用多级缓存

比如服务注册表的多级缓存。readOnlyMap readWriteMap



目录
相关文章
|
3月前
多线程并发锁的方案—原子操作
多线程并发锁的方案—原子操作
|
26天前
|
Java
多线程线程安全问题之什么是锁的粒度,减少锁的粒度有哪些好处
多线程线程安全问题之什么是锁的粒度,减少锁的粒度有哪些好处
|
3月前
|
Java
什么锁比读写锁性能更高?
Java并发编程中,ReentrantReadWriteLock是高效的锁机制,但在高并发环境下,乐观锁(如CAS)和JDK 8引入的StampedLock可提供更高性能。StampedLock支持读锁、写锁和乐观读锁,其乐观读锁在读多写少的场景下能提升并发性能,通过tryOptimisticRead方法实现。当乐观读锁无效时,可无缝切换至悲观读锁。
|
3月前
多线程并发锁方案—自旋锁
多线程并发锁方案—自旋锁
|
3月前
多线程并发锁的方案—互斥锁
多线程并发锁的方案—互斥锁
|
3月前
|
Java 调度 C++
多线程之常见的锁策略
多线程之常见的锁策略
|
设计模式
【并发技术04】线程技术之死锁问题
【并发技术04】线程技术之死锁问题
加锁有什么缺点?
加锁有什么缺点?
51 0
|
安全 Java 程序员
多线程(八):常见锁策略
多线程(八):常见锁策略
162 0
多线程(八):常见锁策略
|
安全 Java 调度
认识并发中常见的锁
1. 锁的作用 2. 乐观锁和悲观锁 1)乐观锁 2)悲观锁 3)乐观锁和悲观锁在 Java 中的典型实现 4)数据版本机制 3. CAS 机制 1)什么是 CAS 2)CAS 的 ABA 问题 4. 读写锁 1)Java 标准库中提供的读写锁 5. 偏向锁、轻量级锁和重量级锁 1)偏向锁 2)轻量级锁 3)重量级锁 6. 自旋锁 7. 公平锁和非公平锁
103 0