如何优化 Java 中的锁的使用?

Sherwin.Wei Lv7

如何优化 Java 中的锁的使用?

回答重点

主要有以下两种常见的优化方法:

1)减小锁的粒度(使用的时间)

  • 尽量缩小加锁的范围,减少锁的持有时间。即在必要的最小代码块内使用锁,避免对整个方法或过多代码块加锁。
  • 使用更细粒度的锁,比如将一个大对象锁拆分为多个小对象锁,以提高并行度(参考 HashTableConcurrentHashMap 的区别)。
  • 对于读多写少的场景,可以使用读写锁ReentrantReadWriteLock)代替独占锁。

2)减少锁的使用

  • 通过无锁编程CAS(Compare-And-Swap)操作和原子类(如 AtomicIntegerAtomicReference)来避免使用锁,从而减少锁带来的性能损耗。
  • 通过减少共享资源的使用,避免线程对同一个资源的竞争。例如,使用局部变量线程本地变量ThreadLocal)来减少多个线程对同一资源的访问。

扩展知识

锁的种类及使用场景

  • 独占锁(Exclusive Lock):如 synchronizedReentrantLock,同一时间只允许一个线程持有锁,适合写操作较多的场景。
  • 读写锁(ReadWriteLock):允许多个线程并发读,但写时需要独占锁,适合读多写少的场景。
  • 乐观锁和悲观锁:悲观锁假设会有并发冲突,每次操作都加锁;而乐观锁假设不会有冲突,通过版本号或 CAS 实现冲突检测。

CAS

原子类

Comments