多线程性能调优(二)--上下文切换

           在多线程编程中,为了保证数据的原子性,我们会使用到锁,那么在高并发场景,由于多个线程竞争锁,就产生了上下文切换(Context Switch),而频繁的上下文切换是非常耗资源的,这是造成性能低下的主要原因。

          那么到底什么是上下文切换?什么情况下发生上下文切换?如何减少上下文切换呢?我们围绕这三问展开探讨。

【什么是上下文切换】

        一个线程被暂停剥夺使用权(cpu时间片用完),另外一个线程被选中开始或者继续运行的过程就叫做上下文切换(Context Switch)

【什么情况下发生上下文切换】

      程序本身触发的切换,我们称这种为自发性上下文切换,比如调用sleep()、wait()、yield9、join()等方法时,还有加锁时,Synchronized和lock锁,都属于自发性上下文切换。

    另一种是由系统或者虚拟机诱发的非自发性上下文切换。比如JVM的垃圾回收机制就属于这种。

 

【如何减少上下文切换】 

    【锁竞争优化】 

             1、减少锁的持有时间。比如加锁代码块除去无关业务,只保留核心业务。

             2、降低锁粒度。锁分离(RRW读写锁)和锁分段(ConcurrentHashMap就是采用锁分段)

             3、乐观锁代替悲观锁。

   【wait/notify优化】

         1、用Obejct.notify()代替Object.notifyAll()。因为前者唤醒指定线程,后者唤醒所有线程

          2、利用利用Lock锁的Condition接口替代Synchronized内部锁的Object.wait()/notify

【设置合理的线程池大小,避免创建过多的线程】

【减少java虚拟机的垃圾回收】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章