你好,而不是使用linkedlist with (reentrant lock)或使用ArrayList (with Collections.synchronizedList)我读过的,使用ConcurrentLinkedDeque将消除使用读/写锁。我想要做的是添加一个游戏角色对象,每次角色进入地图(字段)或离开地图时都会添加和删除该对象。我们可以同时让数百名玩家进入或离开任何地图......
这就是我所做的
private final ConcurrentLinkedDeque<User> charUsers;
public Field() {
this.charUsers = new ConcurrentLinkedDeque<>();
}
public User getUserByID(int id) {
return charUsers.stream().filter(c -> c.getId() == id).findFirst().orElse(null);
}
public void addUser(User chr) {
if (!charUsers.contains(chr)) {
charUsers.add(chr);
}
broadcastPacket(UserPool.userEnterField(chr), chr);
}
public void removeUser(User chr) {
charUsers.remove(chr); // or charUsers.remove();?
broadcastPacket(UserPool.userLeaveField(chr), chr);
}
public void broadcastPacket(byte[] outPacket, User exceptChr) {
charUsers.stream().filter(chr -> !chr.equals(exceptChr)).forEach(
chr -> chr.getClient().getSession().send(outPacket)
);
}
我有点担心并发性,我读过它ConcurrentLinkedDeque在多线程环境中是线程安全的,但是在使用迭代器时它的一致性很弱。我试图避免任何ConcurrentModificationExceptions.
如果不是这种情况,我会更好地使用 sync.List withArrayList或 aLinkedList吗?
与此游戏设计相关的一个附带问题,我基于一个相当古老的基于 Java 的游戏,当时我相信该游戏使用了 Java 1.5,而他们hashmaps改为添加/删除游戏的实体/对象(角色、地图、怪物,NPC)。我相信即使使用ReentrantLock. 所以我正在尝试不同的方法。(尽管该问题可能还有其他因素,但我认为这是主要因素)。
皈依舞
相关分类