瀏覽代碼

BETA: One more deadlock fix thanks JIV

Rumen Nikiforov 13 年之前
父節點
當前提交
3ce0662f19
共有 1 個文件被更改,包括 11 次插入1 次删除
  1. 11 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Character.java

+ 11 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Character.java

@@ -21,6 +21,7 @@ import java.util.Collection;
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.Future;
+import java.util.concurrent.locks.ReentrantLock;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -210,6 +211,8 @@ public abstract class L2Character extends L2Object
 	
 	private L2Character _debugger = null;
 	
+	private final ReentrantLock _teleportLock;
+	
 	/**
 	 * @return True if debugging is enabled for this L2Character
 	 */
@@ -421,6 +424,7 @@ public abstract class L2Character extends L2Object
 		}
 		
 		setIsInvul(true);
+		_teleportLock = new ReentrantLock();
 	}
 	
 	protected void initCharStatusUpdateValues()
@@ -456,13 +460,19 @@ public abstract class L2Character extends L2Object
 	
 	public void onTeleported()
 	{
-		synchronized (this)
+		if (!_teleportLock.tryLock())
+			return;
+		try
 		{
 			if (!isTeleporting())
 				return;
 			spawnMe(getPosition().getX(), getPosition().getY(), getPosition().getZ());
 			setIsTeleporting(false);
 		}
+		finally
+		{
+			_teleportLock.unlock();
+		}
 		if (_isPendingRevive)
 			doRevive();
 	}