java同步块锁定整个方法



我不太确定如何正确使用同步块。我知道使用synchronized关键字会锁定整个类。所以这不是我想要的。我想锁定类中的单个方法。这是我班上的一个例子。

//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);
  }
}

如何正确使用同步块来锁定整个方法?我可以选择任何参数(或名称或密码)吗?之间有什么区别吗

  public static Message createRegisterRequest(String name, String password) {
     synchronized(name){
         Payload payload = createPayload(name, password);
         return new Message(VALUE_REGISTRATION, payload);
      }
  }

和:

  public static Message createRegisterRequest(String name, String password) {
     synchronized(password){
         Payload payload = createPayload(name, password);
         return new Message(VALUE_REGISTRATION, payload);
      }
  }

和:

  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未访问任何共享内容。它看起来像:

 private static Payload createPayload(int playerID, String roomName){
    Payload payload = new Payload();
    payload.setPlayerID(playerID);
    payload.setRoomName(roomName);
    return payload;
}

我认为我必须同步这些方法,因为有多个实例同时访问MessageFactory中的方法。如果我错了,请告诉我。

Java中的同步是使用共享对象进行的。因此,您应该在方法外部有的东西来进行同步。任何局部变量或参数都将不起作用,因为每个方法调用的数据都是局部的,并且不共享。

你应该这样做:

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);
        }
    }
}

最新更新