最近我們遊戲經常收到玩家投訴卡進度條的問題。而且後臺顯示執行佇列和CPU使用率異常高

根據呼叫的JDB分析出 使用xbean 時候會呼叫以下程式碼

在設定xmlobject 時候會有一個 GlobalLock.acquire();

當多執行緒併發設定xmlobject 時候造成互相等待這個GlobalLock 造成各個執行緒卡住,佇列執行效率不高

所以我們目前解決方法就是直接用string 拼接成XML 暫時不用xbean 的功能

  1. public final XmlObject set(XmlObject src)
  2. {
  3. if (isImmutable()) {
  4. throw new IllegalStateException("Cannot set the value of an immutable XmlObject");
  5. }
  6. XmlObjectBase obj = underlying(src);
  7.  
  8. TypeStoreUser newObj = this;
  9.  
  10. if (obj == null)
  11. {
  12. setNil();
  13. return this;
  14. }
  15.  
  16. if (obj.isImmutable()) {
  17. set(obj.stringValue());
  18. }
  19. else {
  20. boolean noSyncThis = preCheck();
  21. boolean noSyncObj = obj.preCheck();
  22.  
  23. if (monitor() == obj.monitor())
  24. {
  25. if (noSyncThis) {
  26. newObj = setterHelper(obj);
  27. }
  28. else {
  29. synchronized (monitor()) {
  30. newObj = setterHelper(obj);
  31. }
  32.  
  33. }
  34.  
  35. }
  36. else if (noSyncThis)
  37. {
  38. if (noSyncObj)
  39. {
  40. newObj = setterHelper(obj);
  41. }
  42. else
  43. {
  44. synchronized (obj.monitor()) {
  45. newObj = setterHelper(obj);
  46. }
  47. }
  48. }
  49. else
  50. {
  51. if (noSyncObj)
  52. {
  53. synchronized (monitor()) {
  54. newObj = setterHelper(obj);
  55. }
  56.  
  57. }
  58.  
  59. boolean acquired = false;
  60. try
  61. {
  62. GlobalLock.acquire();
  63. acquired = true;
  64.  
  65. synchronized (monitor())
  66. {
  67. synchronized (obj.monitor())
  68. {
  69. GlobalLock.release();
  70. acquired = false;
  71.  
  72. newObj = setterHelper(obj);
  73. }
  74. }
  75. }
  76. catch (InterruptedException e)
  77. {
  78. throw new XmlRuntimeException(e);
  79. }
  80. finally
  81. {
  82. if (acquired) {
  83. GlobalLock.release();
  84. }
  85. }
  86. }
  87.  
  88. }
  89.  
  90. return (XmlObject)newObj;
  91. }