1、ArrayList线程异常演示
- java.util.ConcurrentModificationException——>并发修改异常
为什么会出现异常?
public class ArrayListDemo {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
for(int i=1;i<=30;i++) {
new Thread(() -> {
//往集合中添加数据
list.add(UUID.randomUUID().toString().substring(0, 8));
//往集合中取数据
System.out.println(list);
},String.valueOf(i)).start();
}
}
}
2、ArrayList线程安全解决方案
1、Vector
版本古老使用情况不多 ```java public class ArrayListDemo { public static void main(String[] args) {
// ArrayList
List<String> list = new Vector<>();
for(int i=1;i<=30;i++) {
new Thread(() -> {
//往集合中添加数据
list.add(UUID.randomUUID().toString().substring(0, 8));
//往集合中取数据
System.out.println(list);
},String.valueOf(i)).start();
}
}
}
<a name="DlhUT"></a>
### 2、Collections
```java
public class ArrayListDemo {
public static void main(String[] args) {
// ArrayList<String> list = new ArrayList<>();
//Vector解决方案
// List<String> list = new Vector<>();
//Collections解决方案
List<String> list= Collections.synchronizedList(new ArrayList<>());
for(int i=1;i<=30;i++) {
new Thread(() -> {
//往集合中添加数据
list.add(UUID.randomUUID().toString().substring(0, 8));
//往集合中取数据
System.out.println(list);
},String.valueOf(i)).start();
}
}
}
3、CopyOnWriteArrayList
在往集合中添加数据时,先将结合复制一份,往复制的集合中添加新的内容后,再将复制集合中的内容覆盖到原来的集合中。
public class ArrayListDemo {
public static void main(String[] args) {
// ArrayList<String> list = new ArrayList<>();
//Vector解决方案
// List<String> list = new Vector<>();
//Collections解决方案
// List<String> list= Collections.synchronizedList(new ArrayList<>());
List<String> list=new CopyOnWriteArrayList<>();
for(int i=1;i<=30;i++) {
new Thread(() -> {
//往集合中添加数据
list.add(UUID.randomUUID().toString().substring(0, 8));
//往集合中取数据
System.out.println(list);
},String.valueOf(i)).start();
}
}
}
3、HashSet
1、异常演示
public class SetDemo {
public static void main(String[] args) {
Set set=new HashSet();
for(int i=1;i<=30;i++) {
new Thread(() -> {
//往集合中添加数据
set.add(UUID.randomUUID().toString().substring(0, 8));
//往集合中取数据
System.out.println(set);
},String.valueOf(i)).start();
}
}
}
2、CopyOnWriteArraySet
public class SetDemo {
public static void main(String[] args) {
// Set set=new HashSet();
Set set=new CopyOnWriteArraySet();
for(int i=1;i<=30;i++) {
new Thread(() -> {
//往集合中添加数据
set.add(UUID.randomUUID().toString().substring(0, 8));
//往集合中取数据
System.out.println(set);
},String.valueOf(i)).start();
}
}
}
4、HashMap
1、异常演示
public class HashMapDemo {
public static void main(String[] args) {
Map map=new HashMap();
for(int i=1;i<=30;i++) {
int finalI = i;
new Thread(() -> {
String key=String.valueOf(finalI);
//往集合中添加数据
map.put(key,UUID.randomUUID().toString().substring(0, 8));
//往集合中取数据
System.out.println(map);
},String.valueOf(i)).start();
}
}
}
2、ConcurrentHashMap
public class HashMapDemo {
public static void main(String[] args) {
// Map map=new HashMap();
Map<String,Object> map=new ConcurrentHashMap();
for(int i=1;i<=30;i++) {
int finalI = i;
new Thread(() -> {
String key=String.valueOf(finalI);
//往集合中添加数据
map.put(key,UUID.randomUUID().toString().substring(0, 8));
//往集合中取数据
System.out.println(map);
},String.valueOf(i)).start();
}
}
}