public static void main(String[] args) {
List list = new ArrayList<>();
for (int i = 0; i < 30; i++) {
new Thread(()->{ //java.util.ConcurrentModificationException
list.add(UUID.randomUUID().toString());
System.out.println(list);
}).start();
}
}
并发修改异常解决 (Vector)
public static void main(String[] args) {
List list = new Vector<>(); // Vector 全部都加了synchronized 锁 导致并发效率低 不推荐
for (int i = 0; i < 30; i++) {
new Thread(()->{
list.add(UUID.randomUUID().toString());
System.out.println(list);
}).start();
}
}
并发修改异常解决 (Collections)
public static void main(String[] args) {
List list = Collections.synchronizedList(new ArrayList<>()); //返回 加了同步锁的集合
for (int i = 0; i < 30; i++) {
new Thread(()->{
list.add(UUID.randomUUID().toString());
System.out.println(list);
}).start();
}
}
并发修改异常解决 (写时复制类-推荐)
public static void main(String[] args) {
List list = new CopyOnWriteArrayList<>();
for (int i = 0; i < 30; i++) {
new Thread(()->{
list.add(UUID.randomUUID().toString());
System.out.println(list);
}).start();
}
}
源码
public boolean add(E e) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
Object[] elements = getArray();
int len = elements.length;
Object[] newElements = Arrays.copyOf(elements, len + 1);
newElements[len] = e;
setArray(newElements);
return true;
} finally {
lock.unlock();
}
}
集合类之并发修改异常(HashSet)
问题演示
public static void main(String[] args) {
Set list = new HashSet<>();
for (int i = 0; i < 30; i++) {
new Thread(()->{ //java.util.ConcurrentModificationException
list.add(UUID.randomUUID().toString());
System.out.println(list);
}).start();
}
}
问题解决(Collections)
public static void main(String[] args) {
Set list = Collections.synchronizedSet(new HashSet<>());//new HashSet<>();
for (int i = 0; i < 30; i++) {
new Thread(()->{ //java.util.ConcurrentModificationException
list.add(UUID.randomUUID().toString());
System.out.println(list);
}).start();
}
}
问题解决(CopyOnWriteArraySet)
public static void main(String[] args) {
Set list =new CopyOnWriteArraySet<>(); //Collections.synchronizedSet(new HashSet<>());//new HashSet<>();
for (int i = 0; i < 30; i++) {
new Thread(()->{ //java.util.ConcurrentModificationException
list.add(UUID.randomUUID().toString());
System.out.println(list);
}).start();
}
}
注意
HashSet的底层是HashMap , value 是 object ,并且object 是一个 final 修饰的static 变量
CopyonWriteArraySet 使用的是CopyOnWriteArrayList
HashSet 源码:
//构造方法
public HashSet() {
map = new HashMap<>();
}
//add方法
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
// PRESENT 变量定义 //这个就是value 的值
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
CopyOnWriteArraySet源码:
//构造方法
public CopyOnWriteArraySet() {
al = new CopyOnWriteArrayList();
}
// add 方法
public boolean add(E e) {
return al.addIfAbsent(e);
}
//addIfAbsent 方法 这个方法是 CopyonWriteArrayList 的
public boolean addIfAbsent(E e) {
Object[] snapshot = getArray();
return indexOf(e, snapshot, 0, snapshot.length) >= 0 ? false :
addIfAbsent(e, snapshot);
}
集合类之并发修改异常(haahMap)
问题演示
public static void main(String[] args) {
Map list =new HashMap<>(); //Collections.synchronizedSet(new HashSet<>());//new HashSet<>();
for (int i = 0; i < 30; i++) {
new Thread(()->{ //java.util.ConcurrentModificationException
list.put(Thread.currentThread().getName(),UUID.randomUUID().toString());
System.out.println(list);
}).start();
}
}
问题解决(Collections)
public static void main(String[] args) {
Map list = Collections.synchronizedMap(new HashMap());//new HashSet<>();
for (int i = 0; i < 30; i++) {
new Thread(()->{ //java.util.ConcurrentModificationException
list.put(Thread.currentThread().getName(),UUID.randomUUID().toString());
System.out.println(list);
}).start();
}
}
问题解决(Collections)
public static void main(String[] args) {
Map list = new ConcurrentHashMap<>();//Collections.synchronizedMap(new HashMap());//new HashSet<>();
for (int i = 0; i < 30; i++) {
new Thread(()->{ //java.util.ConcurrentModificationException
list.put(Thread.currentThread().getName(),UUID.randomUUID().toString());
System.out.println(list);
}).start();
}
}
练习
public class TransferValue {
public static void main(String[] args) {
int age = 10;
changeAge(age);
System.out.println(age); // 10
Persion p = new Persion("zs");
changeName(p); // changeName
System.out.println(p.getName());
String str = "Str";
changeStr(str);
System.out.println(str); //Str
}
public static void changeName(Persion p){
p.setName("changeName");
}
public static void changeStr(String str){
str ="changeStr " ;
}
public static void changeAge(int age){
age = 100;
}
}
class Persion{
private int age;
private String name;
public Persion(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//总结
// 基本类型是值传递
// 对象是引用



