Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java同步块锁定整个方法_Java_Synchronization_Synchronized Block - Fatal编程技术网

java同步块锁定整个方法

java同步块锁定整个方法,java,synchronization,synchronized-block,Java,Synchronization,Synchronized Block,我不太确定如何正确使用同步块。我知道使用synchronized关键字可以锁定整个类。所以这不是我想要的。我想锁定类中的单个方法。这是我班上的一个例子 //class does only contain static methods public class MessageFactory implements IValues { public static Message createRegisterRequest(String name, String password) {

我不太确定如何正确使用同步块。我知道使用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);
      }
  }
以及:

以及:

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

为什么需要同步呢?
createPayload()
是否正在访问共享的内容?只是猜测,这还不足以给你一个好的答案。谢谢。那么,如何锁定一个只有基本数据类型作为参数的方法呢?
synchronized(name)
synchronized(password)
以相同的方式被破坏,但它们不可预测的行为可能会有细微的差异<代码>对象锁=新对象();已同步(锁定).完全无效。您对
已同步的理解完全错误。它不会锁定任何东西。它只保证同一对象上的代码同步最多由一个线程执行。@OleV.V。我编辑了我的问题。也许你是对的,根本不需要同步。我发表了我的担忧。
 private static Payload createPayload(int playerID, String roomName){
    Payload payload = new Payload();
    payload.setPlayerID(playerID);
    payload.setRoomName(roomName);
    return payload;
}
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);
        }
    }
}