【问题标题】:Java multithreading and linkedlist operationsJava 多线程和链表操作
【发布时间】:2013-10-30 13:23:24
【问题描述】:

我运行一个 java 服务器来支持我正在开发的 android 游戏。服务器接收客户端套接字,打开一个新线程,读取客户端发送的对象并对链表执行操作。

操作包括,如果链表为空,则将新对象添加到链表中。 如果列表不为空,则线程将该对象添加到列表中并返回列表中的不同对象。

if (!check.getName().equals(fighter1.getName())) {
  fighter2 = check;
  itr.remove();
  OutputStream os = clientSocket.getOutputStream();
  ObjectOutputStream oos = new ObjectOutputStream(os);
  oos.writeObject(fighter2);        
  oos.flush();
  checkName = false;
}

这是线程的remove部分,adding部分在前面一点,基本上就是list.add(object);

现在,问题是由于该服务器可以运行多个线程,如果 10 个用户同时连接会发生什么情况,这会不会很有可能导致列表出现空指针/其他错误。

我想扩展这个服务器,使其能够同时处理数百个连接,我目前只是用少数 alpha 测试人员对其进行测试。 关于如何尽可能安全地更改数据,您有什么好的想法吗?

【问题讨论】:

  • 你的添加和删除需要是原子的吗?

标签: java multithreading thread-safety


【解决方案1】:

我认为你应该简单地使用一个线程安全的列表,比如 CopyOnWriteArrayList,只要速度并不重要。 (这是一种肮脏但简单的方法;))

【讨论】:

  • Tbh,通过服务器的数据不是很敏感,如果服务器在添加和删除阶段丢失了一个对象,这根本不是什么大问题,用户不会甚至注意到。唯一的问题是列表是否获得空指针并崩溃。速度不是一个大问题,客户端使用它收到的对象来开始匹配。我做了一个加载屏幕,所以客户端会等待。但是,如果 100 人同时连接并且必须等待一分钟才能开始比赛,这将是一个问题。
  • 那么我认为 CopyOnWriteArrayList 应该是解决您问题的最佳方案。 (您甚至不必更改代码)
  • 所以你的意思只是将我的链表更改为 copyonwritearraylist?
  • 这正是我的意思。
【解决方案2】:

链表不是线程安全的,你可以试试其他线程安全的集合,比如ConcurrentLinkedQueue

【讨论】:

  • 感谢您为我指明了正确的方向!我会检查一下并更改我的服务器
猜你喜欢
  • 2020-02-20
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多