实战Java高并发程序设计笔记
在高并发的环境下,激励的锁竞争会导致程序的性能下降。因为多线程应用除了处理功能需求外,还要额外维护多线程环境的特有信息,例如线程本身的元数据,现场的调度,现场上下文的切换。
降低锁对整体性能下降常用的方法有:避免死锁、减小颗粒度、锁分离等。
提高锁性能的几点建议
- 减少锁持有的时间。先来看一段代码
public synchronized void syncMehtod(){
othercode1();
mutexMethod();
othercode2();
}
假设mutexMethod()需要同步,而 othercode1()和othercode2()不需要做同步控制并且两方法都是重量级方法,会花费较长的CPU时间,对整个方法同步会导致线程等待的时间大大增加。下面是一段优化代码,只对mutexMethod()做同步控制。
public void syncMehtod(){
othercode1();
synchronized (this){
mutexMethod();
}
othercode2();
}
-
减小锁粒度
JDK1.7的中ConcurrentHashMap使用该技术手段实现。将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问,能够实现真正的并发访问如下图是ConcurrentHashMap的内部结构图:
ConcurrentHashMap内部分为很多个Segment,每一个Segment拥有一把锁,然后每个Segment(继承ReentrantLock)下面包含很多个HashEntry列表数组。Segment 都用一把锁。
所谓减少锁粒度就是只减小锁定对象的范围,从而减少锁冲突的可能性,进而提高系统的并发能力。
- 读写分离锁代替独占锁(ReadWriteLock)