gpt4 book ai didi

java - 多线程访问的单例类中的实例变量

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:51:48 25 4
gpt4 key购买 nike

我有一个单例类:

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 ),有添加和删除类(class)学生的方法。

在我的应用程序中,可能有多个线程使用这个 School类别为 getInstance() ,然后添加和删除学生。为了使访问(尤其是访问 students 实例)成为线程安全,我正在考虑使用synchorized getInstanc() 的关键字方法,例如:

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

但我认为我的微不足道的改变只能确保只有一个 School在多线程环境中创建实例。我还需要做什么才能使其线程安全地访问 students 多线程实例。有什么好的建议或意见,谢谢!

最佳答案

离开关于单例是否邪恶的话题,让我们只考虑School 类中的线程安全问题:

  • 共享对象是“延迟”创建的 - 这需要同步以避免产生 School 的两个实例;您已经正确识别并解决了这个问题。但是,由于初始化 School 不会花费太多时间,您不妨通过初始化 school = new School() 使 getInstance() 成为一个简单的 getter > 热切地。
  • School 内部的 hash map - 并发访问 hash map 会导致异常。您需要围绕添加、删除和迭代学生的代码添加同步,以避免这些异常。
  • 访问个别学生 - 一旦调用者获得了一个Student对象,他们就可以同时开始修改它。因此,Student 对象需要自己的并发保护。

关于java - 多线程访问的单例类中的实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18944184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com