I have a server that receives various xml messages from clients (one thread per client) and routes the messages to different functions depending on the message type. Eg. if the first element in the messages contains the string ‘login’ it signifies that this is a login message so route the message to the login() function.
Anyway, I want to make this message so things don’t get messed up if multiple clients are connected and the dispatcher switches threads in middle of the message routing. So here is how I am routing the messages –
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) {}
}
So how can I make this thread safe? I figure I need to put a synchronise statement in somewhere but Im not sure where. Also Ive been reading around on the subject and I found this post which says there is an issue with using synchronise on ‘this’ –
https://stackoverflow.com/a/416198/1088617
And another post here which says singletons aren’t suitable for using synchronise on (My class in the code above is a singleton) – https://stackoverflow.com/a/416202/1088617
Your class is already thread safe, because you are only using local variables.
Thread safety only comes into play when you access class state (ie fields), which your code doesn’t (seem to) do.
What you are talking about is serialization – you want to funnel all message processing through one point to guarantee that message processing is one-at-a-time (starts and finishes atomically). The solution is simple: Employ a
static synchronizedmethod:FYI
static synchronizedmethods use the Class object as the lock. This code will make your code behave like a single thread, which your question seems to want.