java并发编程实战-性能与可伸缩性1

来源:互联网 发布:表白网站整站源码 编辑:程序博客网 时间:2024/05/23 16:56

1,性能与可伸缩性

  1.1,要想通过并发来获得更好的性能,需要努力做好两件事:更有效地利用现有处理资源,以及在出现新的处理资源时使程序尽可能地利用这些新的资源。

  1.2,应用程序性能可以采用多个指标来衡量:服务时间,延迟时间,吞吐率,效率,可伸缩性以及容量等
  1.3,可伸缩性指的是:当增加计算资源时(如:CPU,内存,存储容量或者I/O宽带等),程序的吞吐量或者处理能力能相应地增加
  1.4,避免不成熟的优化,首先使程序正确,然后再提高运行速度
  1.5,在所有并发程序中都包含一些串行部分。如果你认为你的程序中不存在串行部分,那么可以在仔细检查一遍
2,线程引入的开销
  2.1,上下文切换:如果主线程是唯一的线程,那么它基本上不会被调度出去。另一方面,如果可运行的线程数大于CPU的数量,那么操作系统最终会将某个正在运行的线程调度出来,从而是其他线程能够使用CPU,这将导致一次上下文切换。在大多数通用的处理器中,上下文切换的开销相当于5000-10000个时钟周期,也就是几微秒
2,内存同步
  2.1,在synchronized和volatile提供的可见性保证中可能会使用一些特殊指令,即内存栅栏。

  2.2,内存栅栏可以刷新缓存,使缓存无效,刷新硬件的写缓冲,以及停止执行管道。内存栅栏将抑制一些编译器优化操作,在内存栅栏中,大多数操作都是不能被重排序的。

  2.3,现代JVM能通过优化来去掉一些不会发生竞争的锁,一些更完备的JVM能通过逸出分析(Escape Analysis)找出不会发布到堆得本地对象(因此这个引用是线程本地的)。
  2.4,不要过度担心非竞争同步带来的开销,这个基本的机制已经非常快了,并且JVM还能进行额外的优化进一步降低或消除开销。因此我们应该讲优化重点放在那些发生锁竞争的地方。
3,阻塞
  3.1,在锁上竞争失败的线程,肯定会阻塞,JVM在实现阻塞行为时,可以采用自旋等待(Spin-Waiting),或者通过操作系统挂起被阻塞的线程
  3.2,如果等待时间较短,适合采用自旋等待;如果等待时间过长,适合线程挂起

阅读全文
0 0