gpt4 book ai didi

java - HashSet 存储 Singleton 对象两次

转载 作者:行者123 更新时间:2023-12-01 18:44:07 25 4
gpt4 key购买 nike

我通过 10,000 个线程将 Singleton 对象存储在 HashSet 中(即 10,000 次)。令人惊讶的是,有时 HashSet 无法识别 Object 是 Singleton,并且会两次存储同一个对象实例。有时,它只存储一次对象,但其 size() 方法返回值 2 或 3。

我的单例类是:-

public class Singleton {

private Singleton() {

System.out.println("Singleton--- It runs just once");

}

private static class StageSingletonHolder {

static Singleton instance = new Singleton();

}


public static Singleton getInstance() {

return StageSingletonHolder.instance;
}


}

为主类线程提供 run 方法的 RunObject:-

import java.util.HashSet;
import java.util.Set;


public class RunObject implements Runnable{
Singleton singleton;
public static Set<Singleton> set = new HashSet<Singleton>();


public void run(){

singleton = Singleton.getInstance();
set.add(singleton);
}



public int numberOfSingletons(){

for(Singleton single:set){

System.out.println(single);

}

System.out.println("set size : "+set.size());

}

}

我的主要类(class)是:-

  public class MainObject {

public static void main(String[] args){
RunObject runObject = null;
Thread t;
int i = 0;
while(i++ < 10000){
runObject = new RunObject();
t = new Thread(runObject);
t.start();
}

}
}

这里,在某些情况下,同一个对象会被存储多次。我知道单例逻辑可以正常工作,因为它的构造函数只运行一次。从它的构造函数只打印一次语句就可以看出这一点。

造成这种不一致的原因是什么?

最佳答案

HashSet 不是线程安全的。您需要同步添加或使用适当的并发集合来存储单例。

关于java - HashSet 存储 Singleton 对象两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18607201/

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