多线程与并发是为了提升性能,性能提升实际上就是使用更少的资源做更多的事情。
多线程并发出现的问题
多线程并发的目标是提升整体性能,但是使用多线程也会造成一些额外的开销,比如线程之间的协调、上下文切换、线程的创建和销毁、线程调度。如果多线程的性能比实现同功能的性能还差,那就是一个很糟糕的并发设计。
要想通过多线程并发来获得更好的性能,主要做好两个事情:更有效的利用现有处理资源、在出现新的处理资源时使程序尽可能地利用这些新资源,就是尽可能使CPU处于忙碌状态(并不是做无用功),最终的目标就是对资源充分的利用,充分有效的利用就能发挥资源的最大价值,就能最大的提高性能。比如程序是计算密集型可以通过增加处理器来提高性能,如果一个线程不能使CPU一直处于忙碌状态,那么就应该使用多线程使CPU处于忙碌状态。
可伸缩性
要获得更好的性能就需要有效的利用现有资源和利用新出现的资源,现有资源好充分利用,但是新出现的资源就不是那么好办了。所以当增加计算资源时(如CPU、内存、存储容量或者I/O带宽),程序的吞吐量或者处理能力能相应地增加是程序很最重要的功能也就是可伸缩性。
多线程的额外开销
上下文切换:如果可运行的线程数大于CPU的数量,那么操作系统最终会将某个正在运行的线程调度出来,从而使其他线程能够使用CPU,这将导致一次上下文切换,这个过程将保存当前运行线程的执行上下文,并将新调度进来的线程的执行上下文设置为当前上下文。
内存同步:多线程开发一般都会有synchronized和volatile等保证资源的可见性,这些关键字可能会使用一些特殊的指令内存栅栏(Men