JUC并发编程快速入门篇(三)—— 集合的线程安全
List集合线程安全问题
/*
list集合线程安全
*/
public class ThreadDemo4 {
public static void main(String[] args) {
//创建ArrayList集合
// List<String> list = new ArrayList<>(); //不安全
// List<String> list= new Vector<>(); //效率低
// List<String> list = Collections.synchronizedList(new ArrayList<>()); //不推荐使用
List<String> list = new CopyOnWriteArrayList<>(); //推荐使用(重点)
for (int i = 0; i < 10; i++) {
new Thread(()->{
//向集合中添加内容
list.add(UUID.randomUUID().toString().substring(0,8));
//从集合中获取内容
System.out.println(list);
},String.valueOf(i)).start();
}
}
}
Set集合线程安全问题
public class ThreadHashSet {
public static void main(String[] args) {
// Set<String> set = new HashSet<>(); //线程不安全
Set<String> set = new CopyOnWriteArraySet<>(); //线程安全
for (int i = 0; i < 10; i++) {
new Thread(()->{
//向集合中添加内容
set.add(UUID.randomUUID().toString().substring(0, 8));
//从集合中获取内容
System.out.println(set);
},String.valueOf(i)).start();
}
}
}
Map集合线程安全问题
public class ThreadMap {
public static void main(String[] args) {
// Map<String, String> map = new HashMap<>(); //线程不安全
Map<String, String> map = new ConcurrentHashMap(); //线程安全
for (int i = 0; i < 10; i++) {
String key = String.valueOf(i);
new Thread(() -> {
//向集合中添加内容
map.put(key, UUID.randomUUID().toString().substring(0, 8));
//从集合中获取内容
System.out.println(map);
}, String.valueOf(i)).start();
}
}
}
总结
1.线程安全与线程不安全集合
集合类型中存在线程安全与线程不安全的两种,常见例如:
ArrayList ----- Vector
HashMap -----HashTable
但是以上都是通过 synchronized 关键字实现,效率较低
2.Collections 构建的线程安全集合
3.java.util.concurrent 并发包下
CopyOnWriteArrayList CopyOnWriteArraySet 类型,通过动态数组与线程安全个方面保证线程安全