I am not quite sure about how to use a synchronized block correctly. I know that using the synchronized keyword locks the whole class. So that is not want I want. I want to lock the single methods within the class. Here is an example from my class.
//class does only contain static methods
public class MessageFactory implements IValues {
public static Message createRegisterRequest(String name, String password) {
Payload payload = createPayload(name, password);
return new Message(VALUE_REGISTRATION, payload);
}
}
How do I correctly use a synchronize block to lock the whole method? Can I choose any parameter (or name or password)? Is there any difference between:
public static Message createRegisterRequest(String name, String password) {
synchronized(name){
Payload payload = createPayload(name, password);
return new Message(VALUE_REGISTRATION, payload);
}
}
and:
public static Message createRegisterRequest(String name, String password) {
synchronized(password){
Payload payload = createPayload(name, password);
return new Message(VALUE_REGISTRATION, payload);
}
}
and:
public static Message createRegisterRequest(String name, String password) {
Object lock = new Object();
synchronized(lock){
Payload payload = createPayload(name, password);
return new Message(VALUE_REGISTRATION, payload);
}
}
createPayload is not accessing anything shared. It looks like:
private static Payload createPayload(int playerID, String roomName){
Payload payload = new Payload();
payload.setPlayerID(playerID);
payload.setRoomName(roomName);
return payload;
}
I thought that I have to synchronize the methods as there a multiple instances accessing the methods within MessageFactory at the same time. Please let me know if I am wrong.
Synchronization in Java is made using shared object. Therefore you should have something outside the method to synchronize on. Any local variable or parameter will not work, because that data is local for every method call and is not shared.
You should do something like that:
public class MessageFactory implements IValues {
private static final Object LOCK = new Object();
public static Message createRegisterRequest(String name, String password) {
synchronized(LOCK){
Payload payload = createPayload(name, password);
return new Message(VALUE_REGISTRATION, payload);
}
}
}