Java并发编程:性能与可伸缩性

108 阅读2分钟

src=http___i0.hdslb.com_bfs_article_807aa46619617caf3a3ea976300b575abae0676c.png&refer=http___i0.hdslb.webp 本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前言

       我们要进行并发编程,引入多线程,主要的目的就是为了要提高性能。但是性能是什么?我们日常所说的可伸缩性跟性能又有什么关系,本文将为你一一讲解。

性能

       性能是什么?就是我们用多少资源(如CPU、内存、存储容量或者I/O带宽等),能够做到多少事情的一个指标。而提高性能就是要用更少的资源,做更多的事情。

性能指标

       常见的性能指标有:响应时间、吞吐量、错误率、可伸缩性等。

可伸缩性的定义

       由上可见,可伸缩性是常见的一个性能指标,其定义是:增加系统的资源时,能够增加程序的吞吐量和系统响应速度。

Amdahl定律

       在每个程序中,都会包含串行组件和并行组件,由于增加系统资源主要提高的是并行组件的性能,而对串行组件的帮助不大,因此串行组件在程序中所占比例越高,增加系统资源所起到的作用越小,继而程序的可伸缩性也就越低。

锁优化方法

       根据Amdahl定律,要提高系统可伸缩性,就要减少串行组件的比例,而锁住的代码,其实就是串行组件(毕竟同一时间只能有一个线程执行),因此,锁的优化,可以从以下3方面入手:

  • 降低锁的持有时间(快进快出,将非原子操作,且占用时间较长的如I/O操作等代码移出同步代码块)
  • 降低锁的粒度(锁分解、锁分段)
  • 使用非占用锁(使用ReadWriteLock、原子变量等)

后言

       既然看到这里了,感觉有所收获的朋友,不妨来个大大的点赞吧~~~