第十一章 性能与可伸缩性
1.当操作性能受某种特定的资源而收到限制时,通常称该操作为资源密集型的操作
2.与单线程相比,多个线程总会引入一些额外的开销,比如:线程之间的协调(加锁、触发信号、内存同步等),增加的上下文切换,线程的创建与销毁,线程的调度。
上下文切换:操作系统将某个正在运行的线程调度出来,从而使其他线程使用CPU。当一个新的线程被切换进来时,它所需要的数据可能不在当前处理器的本地缓存中,因而,线程首次调度运行时会更加缓慢。
JVM实现线程的阻塞行为,会进行优化,采用自旋尝试,这时不释放CPU资源,避免了从阻塞中恢复的上下文切换开销。
3.减少锁的竞争
1)缩小锁的范围(“快进快出”)
JVM会优化掉不会发生竞争的锁,减少不必要的同步开销,缩小锁的范围,减少单个线程持有锁的时间。
2)减少锁的粒度
将一个锁分成多个锁,减少同一个锁的竞争。比如一个对象中多个独立的变量需要用锁保护,可以定义多个锁,而不是用对象本身当锁。
3)锁分段
锁分段的一个劣势在于,与采用单个锁来实现独占访问相比,要获取多个锁来实现独占访问将更加困难并且开销更高。
4)使用共享锁代替独占锁
人生就像蒲公英,看似自由,其实身不由己。