0

静的メソッドとシングルトン クラスを含むコード サンプルがあります。

//code with static methods
public class DataManager{
  public static Object getDataObject(){
     HashMap map = new HashMap();
     //Some processing in collections
     //retrieval of data
  }
  public static void writeData(Object o){
     HashMap map = new HashMap();
     //Some processing in collections
     //writing data
  }
}
//code with singleton
public class DataManager{
   private static DataManager instance;
   private DataManager(){
   }
   public static DataManager getInstance(){
     if(instance == null){
        synchronized(DataManager.class){
          if(instance == null){
              instance = new DataManager();
          }
       }
    }
    return instance;
  }
  public Object getDataObject(){
     HashMap map = new HashMap();
     //Some processing in collections
     //retrieval of data
  }
  public writeData(Object o){
     HashMap map = new HashMap();
     //Some processing in collections
     //writing data
  }
}

これは、使用する最良の方法です。2 つのスレッドがメソッドの 1 つを呼び出すとどうなりますか? コレクションの処理中にデータが破損する可能性はありますか? 静的メソッドには共通メモリが割り当てられているため、2 つのスレッドが静的メソッドを呼び出すと、互いに影響しますか? シングルトンでは 1 つのインスタンスのみが作成されます。2 つのスレッドが単一のインスタンスでメソッドを呼び出すと、互いに影響しますか? これを理解するのを手伝ってください。ありがとうございました...

4

3 に答える 3

0

異なるスレッドから静的メソッドを呼び出しても、何も破損しません...メソッドが共有インスタンスまたは静的変数を使用/変更している場合を除きますが、その場合、静的な性質を持つメソッドだけでなく、すべてのメソッドに当てはまります。
誰かがこれで混乱したのはこれが初めてではありません...グーグルで検索するか、Stackoverflowで同様の質問を検索してください。この質問は複数回回答されています。

于 2015-09-29T07:18:55.997 に答える
-1

マルチスレッドに関する私の理解では、複数のスレッドからアクセスされるのは共有オブジェクトです。

したがって、両方のプログラムで、マップ オブジェクトは複数のスレッドによってアクセスされる共有インスタンスです。したがって、スレッドセーフにするためにマップオブジェクトを同期する必要があります。

シングルトンまたは静的はこれに関連する方法はありません

于 2015-09-29T07:26:53.110 に答える