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;
      }
    

      

  • 相关阅读:
    Log4net日志记录、详细配置(自己使用>)
    C#中的委托
    关于asp.net假分页的删除操作的随笔
    XML完成小程序
    SQLServer理解copyonly备份操作
    c# 解析JSON的几种办法
    SQL删除重复数据方法
    Jquery 操作Html 控件 CheckBox、Radio、Select 控件
    关于SQL语句中SUM函数返回NULL的解决办法
    数据库里面DataTime时间类型字段,如果为null时
  • 原文地址:https://www.cnblogs.com/maikkk/p/4097583.html
Copyright © 2011-2022 走看看