【多线程性能调优】多线程调优(下):如何优化多线程上下文切换?

  1. 竞争锁优化:在多线程编程中,锁其实不是性能开销的根源,竞争锁才是,锁的优化归根结底就是减少竞争;
    a. 减少锁的持有时间:可以将一些与锁无关的代码移出同步代码块,尤其是那些开销较大的操作以及可能被阻塞的操作;
    b. 降低锁的粒度:同步锁可以保证对象的原子性,我们可以考虑将锁粒度拆分得更小一些,以此避免所有线程对一个锁资源的竞争过于激烈,如锁分离、锁分段;
    c. 非阻塞乐观锁替代竞争锁:CAS;
  2. wait/notify 优化:使用 Lock 锁结合 Condition 接口替代 Synchronized 内部锁中的 wait / notify;
  3. 合理地设置线程池大小,避免创建过多线程:线程池的线程数量设置不宜过大;
  4. 使用协程实现非阻塞等待:协程完全由程序本身所控制,也就是在用户态执行;
  5. 减少 Java 虚拟机的垃圾回收:垃圾回收会导致上下文切换。

  上下文切换是多线程编程性能消耗的原因之一,而竞争锁、线程间的通信以及过多地创建线程等多线程编程操作,都会给系统带来上下文切换。除此之外,I/O 阻塞以及 JVM 的垃圾回收也会增加上下文切换。我们可以将上下文切换也作为系统的性能参考指标,并将该指标纳入到服务性能监控。

猜你喜欢

转载自blog.csdn.net/ChinaLiaoTian/article/details/123344079