[英]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.