【发布时间】:2012-04-15 14:01:50
【问题描述】:
我有一个服务器,它从客户端接收各种 xml 消息(每个客户端一个线程),并根据消息类型将消息路由到不同的函数。例如。如果消息中的第一个元素包含字符串“login”,则表示这是一条登录消息,因此将消息路由到 login() 函数。
无论如何,我想发出这条消息,这样如果连接了多个客户端并且调度程序在消息路由中间切换线程,事情就不会变得混乱。所以这就是我路由消息的方式-
public void processMessagesFromClient(Client client)
{
Document message;
while (true)
{
try
{
message = client.inputStream.readObject();
/*
* Determine the message type
*/
String messageType = getMessageType(message);
// Route the message depending on its type
switch (messageType)
{
case LOGIN:
userModel.handleLogin();
...
...
...
etc...
}
} catch(Exception e) {}
}
那么我怎样才能使这个线程安全呢?我想我需要在某个地方放置一个同步语句,但我不确定在哪里。我也一直在阅读这个主题,我发现这篇文章说在“这个”上使用同步存在问题 - https://stackoverflow.com/a/416198/1088617
这里的另一篇文章说单例不适合使用同步(我上面代码中的类是单例)-https://stackoverflow.com/a/416202/1088617
【问题讨论】:
-
你在哪里开始新线程?
-
所有客户端都使用上面的函数。我为每个客户端启动一个线程,在第一次检索输入/输出流之后,我使用上面的 processMessagesFromClient() 方法无限循环。因此,所有客户端都将共享“消息”变量。他们还将共享 userModel,因为这也是一个单例。当我收到来自客户端的消息时,我认为我应该阻止其他线程,直到我处理完该消息?
标签: java multithreading asynchronous thread-safety