public enum ListService {
INSTANCE;
public static List<Integer> lists = new ArrayList<>();
public void add(Integer num) {
lists.add(num);
}
public void remove() {
int size = lists.size();
lists.remove(size-1);
}
}
如果请求量很大。一个请求在a地方调用add()方法,一个请求b地方调用remove()方法。期望的是一开始长度为5.然后移除下标为4的元素(元素是数字5),结果在得到size的情况下,list元素又增加了,导致移除不是我期望移除的元素,下标为4的元素不是数字5了。
在单线程高并发的情况下会出现这个问题了。对单线程多线程又懵逼了。
如果你指的请求是WEB中不同的Controller,你是在进行多线程调用。单线程高并发现阶段理解为单线程实现下的高吞吐,单线程里面的逻辑是按照队列策略挨个执行请求队列,所以不会出现你这个情况。
1、单线程高并发?你是想高频率调用吧?100个客户端同时调用一个API接口属于高并发。一个线程处理多个请求就要排队了,redis之前的版本就是单线程的。
2、如果是在两个不同的地方分别调用add()、remove():
i:如果add()和remove()的组合可以保持始终一致的固定顺序的有序调用,就算放到两个异步线程中也属于同步调用,伪多线程(可以协调线程进行多线程同步实现)。
ii:多线程调用add()和remove()的表现是add()、remove的调用无规律。
ArrayList是线程不安全的容器。
你可以简单测一下,把请求耗时调高,同时调两个请求,如果a在处理,b被阻塞了,就成了
ArrayList不是线程安全的,多线程安全下用CopyOnWriteArrayList