如何优化 Java 中的锁的使用?
如何优化 Java 中的锁的使用?
回答重点
主要有以下两种常见的优化方法:
1)减小锁的粒度(使用的时间):
- 尽量缩小加锁的范围,减少锁的持有时间。即在必要的最小代码块内使用锁,避免对整个方法或过多代码块加锁。
- 使用更细粒度的锁,比如将一个大对象锁拆分为多个小对象锁,以提高并行度(参考
HashTable和ConcurrentHashMap的区别)。 - 对于读多写少的场景,可以使用读写锁(
ReentrantReadWriteLock)代替独占锁。
2)减少锁的使用:
- 通过无锁编程、CAS(Compare-And-Swap)操作和原子类(如
AtomicInteger、AtomicReference)来避免使用锁,从而减少锁带来的性能损耗。 - 通过减少共享资源的使用,避免线程对同一个资源的竞争。例如,使用局部变量或线程本地变量(
ThreadLocal)来减少多个线程对同一资源的访问。
扩展知识
锁的种类及使用场景
- 独占锁(Exclusive Lock):如
synchronized和ReentrantLock,同一时间只允许一个线程持有锁,适合写操作较多的场景。 - 读写锁(ReadWriteLock):允许多个线程并发读,但写时需要独占锁,适合读多写少的场景。
- 乐观锁和悲观锁:悲观锁假设会有并发冲突,每次操作都加锁;而乐观锁假设不会有冲突,通过版本号或 CAS 实现冲突检测。
CAS
原子类
Comments