2016-04-02 12 views
0

同期ブロックを正しく使用する方法についてはあまりよく分かりません。私は、同期キーワードを使用するとクラス全体をロックすることを知っています。だから私は欲しいとは思わない。私はクラス内の単一のメソッドをロックしたい。ここに私のクラスの例があります。java同期ブロック - メソッド全体をロックする

同期ブロックを使用してメソッド全体を正しくロックするにはどうすればよいですか?パラメータ(または名前またはパスワード)を選択できますか?

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内のメソッドへのアクセスが複数のインスタンスなどのメソッドを同期させるために持っていることを考えました。私が間違っている場合は教えてください。

+3

をなぜあなたはすべてで同期する必要がありますか? 'createPayload()'が共有するものにアクセスしていますか?ちょうど推測、それはあなたに良い答えを与えるために十分ではありません。 –

+0

ありがとうございます。では、基本データ型のみを持つメソッドをパラメータとしてロックするにはどうすればよいですか? – mollwitz

+0

'synchronized(name)'と 'synchronized(password)'も同じ方法で壊れていますが、予測できない振る舞いには若干の違いがあるかもしれません。 'オブジェクトロック=新しいオブジェクト();同期(ロック)... 'は全く効果がありません。 – Holger

答えて

0

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); 
     } 
    } 
} 
関連する問題