简体   繁体   English

Java同步块-锁定整个方法

[英]java synchronized block - locking the whole method

I am not quite sure about how to use a synchronized block correctly. 我不太确定如何正确使用同步块。 I know that using the synchronized keyword locks the whole class. 我知道使用synced关键字会锁定整个类。 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. createPayload没有访问共享的任何内容。 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. 我以为我必须同步方法,因为有多个实例同时访问MessageFactory中的方法。 Please let me know if I am wrong. 如果我错了,请告诉我。

Synchronization in Java is made using shared object. Java中的同步是使用共享对象进行的。 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);
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM