??????嗨,大家好,欢迎来到程序猿漠然公众号,我是漠然。
Map、List、Set 是 Java 中非常常用的集合类,它们在多线程环境下有各自的线程安全类和线程不安全的类。本文将分别介绍这三个集合类型的线程安全类和线程不安全的类,并举例说明。 一、Map
2.?线程不安全的类:HashMap HashMap 是 Java 提供的一个非线程安全的 HashMap 实现类。在多线程环境下,多个线程同时访问 HashMap 可能导致数据不一致。以下是线程不安全的示例代码:
public?class?HashMapDemo?{
????public?static?void?main(String[]?args)?{
????????Map<String,?Integer>?map?=?new?HashMap<>();
????????map.put("a",?1);
????????map.put("b",?2);
????????Thread?t1?=?new?Thread(()?->?{
????????????map.put("a",?3);
????????});
????????Thread?t2?=?new?Thread(()?->?{
????????????map.put("b",?4);
????????});
????????t1.start();
????????t2.start();
????????try?{
????????????t1.join();
????????????t2.join();
????????}?catch?(InterruptedException?e)?{
????????????e.printStackTrace();
????????}
????????System.out.println(map.get("a"));?//?输出?3
????????System.out.println(map.get("b"));?//?输出?4
????}
}
二、List
1.?线程安全的类:CopyOnWriteArrayList CopyOnWriteArrayList 是 Java 提供的一个线程安全的 ArrayList 实现类。它通过在写操作时创建底层数组的新副本,实现了线程安全。CopyOnWriteArrayList 的主要特点如下:
public?class?ArrayListDemo?{
????public?static?void?main(String[]?args)?{
????????List<String>?list?=?new?ArrayList<>();
????????list.add("a");
????????list.add("b");
????????Thread?t1?=?new?Thread(()?->?{
????????????list.add("c");
????????});
????????Thread?t2?=?new?Thread(()?->?{
????????????list.add("d");
????????});
????????t1.start();
????????t2.start();
????????try?{
????????????t1.join();
????????????t2.join();
????????}?catch?(InterruptedException?e)?{
????????????e.printStackTrace();
????????}
????????System.out.println(list.size());?//?输出?4
????}
}
三、Set
public?class?HashSetDemo?{
????public?static?void?main(String[]?args)?{
????????Set<String>?set?=?new?HashSet<>();
????????set.add("a");
????????set.add("b");
????????Thread?t1?=?new?Thread(()?->?{
????????????set.add("c");
????????});
????????Thread?t2?=?new?Thread(()?->?{
????????????set.add("d");
????????});
????????t1.start();
????????t2.start();
????????try?{
????????????t1.join();
????????????t2.join();
????????}?catch?(InterruptedException?e)?{
????????????e.printStackTrace();
????????}
????????System.out.println(set.size());?//?输出?4
????}
}
总结 本文介绍了 Map、List、Set 三个集合类型的线程安全类和线程不安全的类,并给出了示例代码。在多线程环境下,建议使用线程安全的集合类,如 ConcurrentHashMap、CopyOnWrite
今天的分享就到这里,如果觉得对你有帮助,感谢点赞、分享、关注一波,你的认可是我创造的最大动力。
更多内容请关注公众号:程序猿漠然,一个分享有趣后端知识的公众号。