zoukankan      html  css  js  c++  java
  • synchronized 锁粗化,锁消除

    锁消除是逃逸分析后的优化:

    这时我们可以通过编译器将其优化,将锁消除,前提是java必须运行在server模式(server模式会比client模式作更多的优化),同时必须开启逃逸分析:

    -server -XX:+DoEscapeAnalysis -XX:+EliminateLocks

    其中+DoEscapeAnalysis表示开启逃逸分析,+EliminateLocks表示锁消除。

    逃逸分析:比如上面的代码,它要看sBuf是否可能逃出它的作用域?如果将sBuf作为方法的返回值进行返回,那么它在方法外部可能被当作一个全局对象使用,就有可能发生线程安全问题,这时就可以说sBuf这个对象发生逃逸了,因而不应将append操作的锁消除,但我们上面的代码没有发生锁逃逸,锁消除就可以带来一定的性能提升。

    ===================

    锁粗化本质就是,细粒度锁在影响业务的前提下,改变为粗粒度锁,来降低无意义的资源消耗:

    注意:这样做是有前提的,就是中间不需要同步的代码能够很快速地完成,如果不需要同步的代码需要花很长时间,就会导致同步块的执行需要花费很长的时间,这样做也就不合理了。

    另一种需要锁粗化的极端的情况是:

    1.  
      for(int i=0;i<size;i++){
    2.  
      synchronized(lock){
    3.  
      }
    4.  
      }

    上面代码每次循环都会进行锁的请求、同步与释放,看起来貌似没什么问题,且在jdk内部会对这类代码锁的请求做一些优化,但是还不如把加锁代码写在循环体的外面,这样一次锁的请求就可以达到我们的要求,除非有特殊的需要:循环需要花很长时间,但其它线程等不起,要给它们执行的机会。

    锁粗化后的代码如下:

    1.  
      synchronized(lock){
    2.  
      for(int i=0;i<size;i++){
    3.  
      }
    4.  
       
  • 相关阅读:
    poj 1182食物链
    几何原本查询程序1.0
    code forces 548C:Mike and frog
    CC2530串口通信
    CC2530定时器的应用
    CC2530应用——按键控制灯光状态变化
    步入LTE、多址技术
    定时器之基于模模式的间隔定时
    CC2530定时器
    配置路由器(1)
  • 原文地址:https://www.cnblogs.com/zzq-include/p/13750054.html
Copyright © 2011-2022 走看看