2016-04-02 16 views
0

Senkronize bir bloğun nasıl doğru şekilde kullanılacağından tam olarak emin değilim. Senkronize anahtar kelimenin kullanılmasının tüm sınıfı kilitlediğini biliyorum. Yani istemiyorum istemiyorum. Sınıf içindeki tek yöntemleri kilitlemek istiyorum. İşte dersimden bir örnek.java senkronize blok - tüm yöntemi kilitleme

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

Tüm yöntemi kilitlemek için senkronize bir bloğu doğru şekilde nasıl kullanırım? Herhangi bir parametre (veya isim veya şifre) seçebilir miyim?

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

ve:

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

ve:

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 paylaşılan her şeyi erişmiyor arasında herhangi bir fark yoktur. Ben orada aynı anda MessageFactory içinde yöntemler erişen bir birden çok örneği yöntemlerini eşitlemek zorunda olduğunu düşündü

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

: gibi görünüyor. Yanılıyorsam lütfen bana bildirin.

+3

Neden hiç senkronize etmek gerekiyor? 'CreatePayload() 'paylaşılan bir şeylere erişiyor mu? Sadece tahmin et, ve bu sana iyi bir cevap vermek için yeterli değil. –

+0

Teşekkürler. Öyleyse, sadece temel veri türlerini parametre olarak kullanan bir yöntemi nasıl kilitlerim? – mollwitz

+0

'senkronize (isim)' ve 'senkronize (şifre)' aynı şekilde kırılır, ancak öngörülemeyen davranışlarında küçük farklılıklar olabilir. 'Nesne kilidi = yeni Nesne(); senkronize (kilit)… 'hiç bir etkisi yoktur. – Holger

cevap

0

Java'da eşitleme, paylaşılan nesnesini kullanarak yapılır. Bu nedenle, eşitleme yöntemi dışında bir şey olmalıdır. Herhangi bir yerel değişken veya parametre çalışmayacaktır, çünkü bu veriler her yöntem için yereldir ve paylaşılmaz. Böyle bir şey yapmalıyız

:

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