2016-09-20 6 views
3

私はJavaを使用してバックエンドサービスを実装しています。 Singletonパターンを適用することを選択したのは、1つのサービスしか実行していないためです。ただし、このサービスはSocket.IOクライアントでもあるため、サーバーがプッシュしたときに何らかのイベントが発生する必要があります。しかし、イベントは​​キューにある必要があります。デザインパターン:Javaのシングルトンパターンで同期メソッドまたはブロックを作成する方法は?

私の実装は正しくないと思います。ちょうどsynchronized(this)ブロックがBackendオブジェクトを保護しているのではなく、Emitter.Listenerオブジェクトを保護しているようです。あなたが引用されたラインで

private static synchronized BackendServer getInstance() 
{ 
    if(instance == null) { 
     instance = new BackendServer(); 
     try { 
      socket = IO.socket(host_name+":"+port_frontend); 
      socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() { 
       @Override 
       public void call(Object... args) { 
       } 
      }).on("event1", new Emitter.Listener() { 
       @Override 
       public void call(Object... args) { 
        try { 
         synchronized(this) { <--Which object is synchronized? 
          String timestamp = getCurrentTime(); 
          String logging = "["+timestamp+"] "; 
+0

'BackendServer'のインスタンスメソッドでソケットを作成するべきではありませんか?サーバの場合は、スタイル通りにソケットを作成しないでください。 – RealSkeptic

答えて

3

thisは確かEmitter.Listenerインスタンスを参照します。したがって、新しいEmitter.Listenerインスタンスをモニターとして使用する同期ブロックを作成しています。これはおそらくあなたが望むものではありません。別のオブジェクトで同期させたい場合は、そのオブジェクトを同期ブロックに入れることができます。

同期ブロックは、オブジェクトを保護しないことに注意してください。。それらは、の異なるスレッドによって同時に同期されたブロック(または同じモニターを持つ他の同期されたブロック)が同時に視認されないことを確認します。同じオブジェクトに他の非同期コードがある場合は、同時に実行することができます。

+0

@RealSkeptic。右。私はそれを逃した、ありがとう。私は答えを編集します。 – Hoopje

+0

お返事ありがとうございます。 BackendServerオブジェクトを同期させたい。 Emitter.Listener関数の中でこれを達成する方法に関するいくつかのコードを教えてください。 – loudking

関連する問題