为了账号安全,请及时绑定邮箱和手机立即绑定

hashset set方法取值问题,运行结果中,结果集只有一个元素,size() 获取的值 > 1

hashset set方法取值问题,运行结果中,结果集只有一个元素,size() 获取的值 > 1

哆啦的时光机 2019-01-17 14:26:46
1、如下代码 package gof.singleton; import java.util.HashSet; import java.util.Set; import java.util.concurrent.CountDownLatch; //多线程安全 public class Singleton2 { private static Singleton2 singleton = new Singleton2(); private Singleton2() {} public static Singleton2 getSingleton() { return singleton; } public static void main(String[] args) throws InterruptedException { for(int j = 0;j<10;j++) { CountDownLatch c = new CountDownLatch(1000); Set<Singleton2> list = new HashSet<Singleton2>(); for(int i= 0 ;i<1000;i++) { new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } list.add(Singleton2.getSingleton()); c.countDown(); } }).start(); } c.await(); System.out.println(list + "-" + list.size()); //list.stream().forEach(System.out::println); } } } 2、一种可能的结果 [gof.singleton.Singleton2@a627065]-3 [gof.singleton.Singleton2@a627065]-5 [gof.singleton.Singleton2@a627065]-2 [gof.singleton.Singleton2@a627065]-5 [gof.singleton.Singleton2@a627065]-2 [gof.singleton.Singleton2@a627065]-1 [gof.singleton.Singleton2@a627065]-4 [gof.singleton.Singleton2@a627065]-3 [gof.singleton.Singleton2@a627065]-1 [gof.singleton.Singleton2@a627065]-3 3、问题为什么集合中元素和打印的个数不匹配### 题目描述 题目来源及自己的思路 相关代码 // 请把代码文本粘贴到下方(请勿用图片代替代码) 你期待的结果是什么?实际看到的错误信息又是什么?
查看完整描述

2 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

HashSet使用add方法就是调HashMap的put方法,list.size()就是HashMap的size()方法,返回HashMap的size属性,
list的size大于1是因为HashMap并发导致线程安全问题。
换成Set<Singleton2> list =Collections.synchronizedSet(new HashSet<Singleton2>());即可

查看完整回答
反对 回复 2019-02-12
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

Java 关于 HashSet 的文档中明确表明该类不是线程安全的,所以绝对不要用多个线程操作同一个 HashSet 对象。

查看完整回答
反对 回复 2019-02-12
  • 2 回答
  • 0 关注
  • 2038 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号