zoukankan      html  css  js  c++  java
  • 解决因为使用了官方xbean-2.4.0.jar 的库造成的性能问题

    最近我们游戏经常收到玩家投诉卡进度条的问题。而且后台显示执行队列和CPU使用率异常高

    根据调用的JDB分析出 使用xbean 时候会调用以下代码

    在设置xmlobject 时候会有一个 GlobalLock.acquire();

    当多线程并发设置xmlobject 时候造成互相等待这个GlobalLock 造成各个线程卡住,队列执行效率不高

    所以我们目前解决方法就是直接用string 拼接成XML 暂时不用xbean 的功能

    public final XmlObject set(XmlObject src)
      {
        if (isImmutable()) {
          throw new IllegalStateException("Cannot set the value of an immutable XmlObject");
        }
        XmlObjectBase obj = underlying(src);
    
        TypeStoreUser newObj = this;
    
        if (obj == null)
        {
          setNil();
          return this;
        }
    
        if (obj.isImmutable()) {
          set(obj.stringValue());
        }
        else {
          boolean noSyncThis = preCheck();
          boolean noSyncObj = obj.preCheck();
    
          if (monitor() == obj.monitor())
          {
            if (noSyncThis) {
              newObj = setterHelper(obj);
            }
            else {
              synchronized (monitor()) {
                newObj = setterHelper(obj);
              }
    
            }
    
          }
          else if (noSyncThis)
          {
            if (noSyncObj)
            {
              newObj = setterHelper(obj);
            }
            else
            {
              synchronized (obj.monitor()) {
                newObj = setterHelper(obj);
              }
            }
          }
          else
          {
            if (noSyncObj)
            {
              synchronized (monitor()) {
                newObj = setterHelper(obj);
              }
    
            }
    
            boolean acquired = false;
            try
            {
              GlobalLock.acquire();
              acquired = true;
    
              synchronized (monitor())
              {
                synchronized (obj.monitor())
                {
                  GlobalLock.release();
                  acquired = false;
    
                  newObj = setterHelper(obj);
                }
              }
            }
            catch (InterruptedException e)
            {
              throw new XmlRuntimeException(e);
            }
            finally
            {
              if (acquired) {
                GlobalLock.release();
              }
            }
          }
    
        }
    
        return (XmlObject)newObj;
      }
    

      

  • 相关阅读:
    UVA Live Achrive 4327 Parade (单调队列,dp)
    从磁盘读取一个文件到内存中,再打印到控制台
    二分查找法
    日期:Date
    线程与进程
    泛型基本知识
    泛型
    Map集合的遍历方式:
    Arrays
    Set接口
  • 原文地址:https://www.cnblogs.com/maikkk/p/4097583.html
Copyright © 2011-2022 走看看