9

私はシングルトンクラスを持っています:

public class School {
    private HashMap<String, String> students;

    private static School school;

    private School(){
        students = new HashMap<String, String>();   
    }

    public static School getInstance(){
       if(school == null){
           school = new School();
       }
       return school;
    }

    //Method to add student
    protected void addStudent(String id, String name){
          students.put(id,name);
    }
    //Method to remove student
    protected void removeStudent(String id){
          students.remove(id);
    }
}

上記のように、シングルトン クラスにはstudents変数 (a HashMap) があり、クラスに学生を追加および削除するメソッドがあります。

School私のアプリケーションでは、このクラスを使用してgetInstance()、学生を追加および削除する複数のスレッドが存在する可能性があります。アクセス(特に students インスタンスへのアクセス)をスレッドセーフにするために、次のようにメソッドにsynchorizedキーワードを使用することを考えています:getInstanc()

public synchronized static School getInstance(){
       if(school == null){
           school = new School();
       }
       return school;
    }

しかし、私の些細な変更は、マルチスレッド環境で作成されるインスタンスが1 つだけであることを確認できると思います。 複数のスレッドによるインスタンスへのアクセスに対してもスレッドセーフにするSchoolために、他に何をする必要がありますか。良い提案やコメントをお待ちしております。 students

4

4 に答える 4

0

メソッドを同期するとスレッドセーフになります。つまり、一度にそのメソッドを実行できるスレッドは 1 つだけです。

ただし、上記の状況では、 addStudent および removeStudent メソッドのみを同期することをお勧めします。または、以下を使用して生徒のハッシュ マップを同期することもできます。

Collections.synchronizedMap(new HashMap());

于 2013-09-22T13:16:50.940 に答える