首页 新闻 搜索 专区 学院

单线程高并发会有读写问题吗

0
[已解决问题] 解决于 2021-08-21 23:02
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了。
在单线程高并发的情况下会出现这个问题了。对单线程多线程又懵逼了。

15年的夏天的主页 15年的夏天 | 菜鸟二级 | 园豆:204
提问于:2021-08-20 15:25
< >
分享
最佳答案
0

如果你指的请求是WEB中不同的Controller,你是在进行多线程调用。单线程高并发现阶段理解为单线程实现下的高吞吐,单线程里面的逻辑是按照队列策略挨个执行请求队列,所以不会出现你这个情况。
1、单线程高并发?你是想高频率调用吧?100个客户端同时调用一个API接口属于高并发。一个线程处理多个请求就要排队了,redis之前的版本就是单线程的。
2、如果是在两个不同的地方分别调用add()、remove():
i:如果add()和remove()的组合可以保持始终一致的固定顺序的有序调用,就算放到两个异步线程中也属于同步调用,伪多线程(可以协调线程进行多线程同步实现)。
ii:多线程调用add()和remove()的表现是add()、remove的调用无规律。
ArrayList是线程不安全的容器。

奖励园豆:5
河图书卦 | 菜鸟二级 |园豆:204 | 2021-08-20 16:18
其他回答(2)
0

你可以简单测一下,把请求耗时调高,同时调两个请求,如果a在处理,b被阻塞了,就成了

| 园豆:984 (小虾三级) | 2021-08-20 15:44
0

ArrayList不是线程安全的,多线程安全下用CopyOnWriteArrayList

95的人 | 园豆:321 (菜鸟二级) | 2021-08-20 16:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册