package J20250730.demo13; import java.util.Collections; import java.util.HashSet; import java.util.Set; /** * @author WanJl * @version 1.0 * @title Demo01 * @description * 题目 1:多线程操作 HashSet 的线程安全问题 * 需求: * 创建 3 个线程,同时向一个 HashSet 中添加 1-100 的整数(每个线程负责不同区间, * 如线程 1 加 1-33,线程 2 加 34-66,线程 3 加 67-100),观察最终集合大小是否为 100 * (可能出现重复添加),然后使用 Collections.synchronizedSet () 包装 HashSet, * 确保线程安全并验证结果。 * @create 2025/7/30 */ public class Demo01 { public static void main(String[] args) throws InterruptedException { Set set=new HashSet<>(); Set synchronizedSet = Collections.synchronizedSet(new HashSet<>()); testSet(set,"线程不安全的集合"); testSet(synchronizedSet,"线程安全的集合"); } private static void testSet(Set set,String label) throws InterruptedException { Thread t1=new Thread(()->{ for (int i = 1; i <=33 ; i++) { set.add(i); } System.out.println(label+Thread.currentThread().getName()+"最终大小:"+set.size()); },"线程1"); Thread t2=new Thread(()->{ for (int i = 34; i <=66 ; i++) { set.add(i); } System.out.println(label+Thread.currentThread().getName()+"最终大小:"+set.size()); },"线程2"); Thread t3=new Thread(()->{ for (int i = 67; i <=100 ; i++) { set.add(i); } System.out.println(label+Thread.currentThread().getName()+"最终大小:"+set.size()); },"线程3"); t1.start(); t2.start(); t3.start(); t1.join(); t2.join(); t3.join(); System.out.println(label+"最终大小:"+set.size()); } }