簡體   English   中英

Java同步塊-鎖定整個方法

[英]java synchronized block - locking the whole method

我不太確定如何正確使用同步塊。 我知道使用synced關鍵字會鎖定整個類。 所以那不是我想要的。 我想鎖定類中的單個方法。 這是我班上的一個例子。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM