异常代码:
java
代码解读
复制代码
public class ListTest {
public static void main(String[] args) {
List<Object> list = new ArrayList<>();
for (Integer i = 0; i < 10; i++) {
new Thread(()->{
list.add(UUID.randomUUID().toString().substring(0,5));
System.out.println(list);
},i.toString()).start();
}
}
}
解决办法:使用线程安全类 copyOnWrite就是写入时复制,简称COW,是计算机程序设计中的一个优化策略 CopyOnWriteArrayList原理:现成不安全的ArrayList在多线程添加的时候,会造成多个线程同时写入1下标的值,导致覆盖报错。CopyOnWriteArrayList是写入的时候复制多个List,最后再合并。
copyOnWriteArrayList比vector的优势在于,vector是synchronized实现的,效率相对低,CoptyOnWriteArrayList是使用Lock锁实现的。
copyOnWriteArrayList是List的现成安全类
java
代码解读
复制代码
public class ListTest {
public static void main(String[] args) {
// 使用juc的CopyOnWriteArrayList类,它是线程安全的
List<Object> list = new CopyOnWriteArrayList<>();
for (Integer i = 0; i < 10; i++) {
new Thread(()->{
list.add(UUID.randomUUID().toString().substring(0,5));
System.out.println(list);
},i.toString()).start();
}
}
}
OverOnWriteArraySet是HashSet的安全类
java
代码解读
复制代码
public static void main(String[] args) {
Set<String> set = new CopyOnWriteArraySet<>();
for (Integer i = 0; i < 50; i++) {
new Thread(()->{
String uid = UUID.randomUUID().toString();
set.add(uid);
System.out.println(set);
},i.toString()).start();
}
}
ConCurrentHashMap类是HashMap的安全类
java
代码解读
复制代码
public class MapTest {
public static void main(String[] args) {
Map<String,String> map = new ConcurrentHashMap<>();
for (Integer i = 0; i < 50; i++) {
new Thread(()->{
String uid = UUID.randomUUID().toString();
map.put(uid,uid);
System.out.println(map);
},i.toString()).start();
}
}
}