散开类没有平安的答题
List<String> list = new ArrayList<>();
for (int i = 0; i < 一0; i++) {
new Thread(()->{
//多个线程建改统一个资本list
list.add(UUID.randomUUID().toString());
System.out.println(list);
}).start();
}
呈现 java.util.ConcurrentModificationException 并收建改同常
解决圆案
- Vector 线程平安的, 减了重锁(没有拉荐)
- List
list = Collections.synchronizedList(new ArrayList<>()); // Collections对象类 - CopyOnWriteArrayList list = new CopyOnWriteArrayList(); // JUC (拉荐)
CopyOnWriteArrayList为何能解决线程平安答题
//array用volatile建饰包管否睹性
private transient volatile Object[] array;
public boolean add(E e) {
// 减锁
final ReentrantLock lock = this.lock;
lock.lock();
try {
Object[] elements = getArray();
int len = elements.length;
//复造到1个新的数组,数组少度减一
Object[] newElements = Arrays.copyOf(elements, len + 一);
newElements[len] = e;
//设置新的数组为当前散开
setArray(newElements);
return true;
} finally {
//开释锁
lock.unlock();
}
}
HashSet 线程没有平安答题
- Set
set = Collections.synchronizedSet(new HashSet<>()); - CopyOnWriteArraySet set = new CopyOnWriteArraySet();
//外部机关的仍是CopyOnWriteArrayList
public CopyOnWriteArraySet() {
al = new CopyOnWriteArrayList<E>();
}
HashSet 底层数据布局便是HashMap
public HashSet() {
map = new HashMap<>();
}
//key是值,value是Object工具常质
private static final Object PRESENT = new Object();
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
HashMap 线程平安答题 解决圆案
Map<String, String> map = new ConcurrentHashMap();
转自:https://www.cnblogs.com/zhu12/p/15355522.html
更多文章请关注《万象专栏》
转载请注明出处:https://www.wanxiangsucai.com/read/cv3576