Java并发编程实战 - 第11章 性能与可伸缩性

线程最主要的目的是提高程序的运行性能。但线程也会引入额外的开销,如线程之间的协调,上下文切换,线程的创建和销毁,线程的调度。

性能有很多指标,如运行速度,吞吐量,可伸缩性等。
可伸缩性指增加计算资源时(如CPU,内存,I/O带宽,存储容量等),程序的吞吐量或处理能力能相应的增加。
Amdahl定律
可伸缩性取决于所在代码中必须串行执行的代码比例。

线程引入的开销

  • 上下文切换
    保存当前线程的上下文,并将新调度进来的线程上下文设置为当前上下文。
  • 内存同步
    同步操作,synchronized 和volatile提供的可见性保证中可能使用内存栅栏指令刷新内存。
    非竞争的锁,JVM通过优化去掉锁操作。
  • 阻塞
    大多数JVM在等待锁时只是将线程挂起,这个过程包括额外的上下文切换。

如何提升可伸缩性?
减少锁的竞争能够提高性能和伸缩性。
锁上发生的竞争有两个因素:锁的请求频率和每次的持有该锁的时间

  • 缩小锁的范围,缩短锁的持有时间。
  • 减小锁的粒度,降低锁的请求频率。
    • 可以通过锁分解和锁分段等技术实现,如ConcurrentHashmap。
  • 放弃独占锁
    • 使用并发容器,读写锁,不可变对象以及原子变量。
  • 监测CPU的利用率
    • Unix 和 Windows都有监测CPU的工具。
      Unix 监测CPU的工具 vmstat 和mpstat;
      Unix I/O监测工具 iostat;
      WIndows CPU和I/O监测工具 perfmon。
  • 不用对象池
    • 多线程对对象池中的对象的访问开销很大

减少上下文切换的开销

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值