使用并发编程的目标是为了提升系统性能,引入多线程后,其实会引入额外的开销,如线程之间的协调、增加的上下文切换,线程的创建和销毁,线程的调度等等。过度或不恰当的使用,可能会导致多线程程序性能甚至比单线程还要低。
影响性能的因素
上下文切换
是指CPU 从一个进程或线程切换到另一个进程或线程。一次上下文切换花费5000~10000个时钟周期,几微秒。在上下文切换过程中,CPU会停止处理当前运行的程序,并保存当前程序运行的具体位置以便之后继续运行。
内存同步
一般指加锁,对加锁来说,需要增加额外的指令,这些指令都需要刷新缓存等等操作。
提升性能的方法
减少锁的粒度
使用锁的时候,锁所保护的对象是多个,当这些多个对象其实是独立变化的时候,不如用多个锁来一一保护这些对象。但是如果有同时要持有多个锁的业务方法,要注意避免发生死锁。
缩小锁的范围
对锁的持有实现快进快出,尽量缩短持由锁的的时间。将一些与锁无关的代码移出锁的范围,特别是一些耗时,可能阻塞的操作。
锁分段
ConcurrrentHashMap就是典型的锁分段。
替换独占锁
在业务允许的情况下:
1、使用读写锁,
2、用自旋CAS
3、使用系统的并发容器