锁的优化及注意事项(1)

实战Java高并发程序设计笔记


在高并发的环境下,激励的锁竞争会导致程序的性能下降。因为多线程应用除了处理功能需求外,还要额外维护多线程环境的特有信息,例如线程本身的元数据,现场的调度,现场上下文的切换。

降低锁对整体性能下降常用的方法有:避免死锁、减小颗粒度、锁分离等。

提高锁性能的几点建议

  1. 减少锁持有的时间。先来看一段代码
public synchronized void syncMehtod(){
        othercode1();
        mutexMethod();
        othercode2();
    }

假设mutexMethod()需要同步,而 othercode1()和othercode2()不需要做同步控制并且两方法都是重量级方法,会花费较长的CPU时间,对整个方法同步会导致线程等待的时间大大增加。下面是一段优化代码,只对mutexMethod()做同步控制。

public  void syncMehtod(){
        othercode1();
        synchronized (this){
             mutexMethod();
        }
        othercode2();
    }
  1. 减小锁粒度
    JDK1.7的中ConcurrentHashMap使用该技术手段实现。将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问,能够实现真正的并发访问如下图是ConcurrentHashMap的内部结构图:


    锁的优化及注意事项(1)_第1张图片
    ConcurrentHashMap的内部结构图

    ConcurrentHashMap内部分为很多个Segment,每一个Segment拥有一把锁,然后每个Segment(继承ReentrantLock)下面包含很多个HashEntry列表数组。Segment 都用一把锁。

所谓减少锁粒度就是只减小锁定对象的范围,从而减少锁冲突的可能性,进而提高系统的并发能力。

  1. 读写分离锁代替独占锁(ReadWriteLock)

你可能感兴趣的:(锁的优化及注意事项(1))