package Thread_Study.synchro;
import java.util.concurrent.CopyOnWriteArrayList;
public class TestJUC {
public static void main(String[] args) {
CopyOnWriteArrayList<String> list=new CopyOnWriteArrayList<String>();
for (int i = 0; i < 10000; i++) {
new Thread(()->{
list.add(Thread.currentThread().getName());
}).start();
}
/*try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
System.out.println(list.size());
}
}
它出现的结果应该有很多吧,自己大概测试了30次,不加延时出现的可能有:9999、9998、9997
把错误信息贴出来看看,是什么原因产生的问题。
public static void main(String[] args){
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<String>();
for (int i = 0; i < 10000; i++) {
new Thread(() -> {
list.add(Thread.currentThread().getName());
}).start();
}
// 只剩下主线程和 GC 线程时才打印数量
while (Thread.activeCount() != 2);
System.out.println(list.size());
}
原理就是,for 循环执行完了,但是不一定执行了 add
size 少了2 是吗?
你意思打印size每次都不一样是吧,因为你创建线程start后也不是立即执行的,主线程创建完1000个线程就打印size了,但1000个线程一定执行完了吗
题注的意思应该是不加睡眠,这个线程数不对,不是10000个,而是少于等于10000个. CopyOnWriteArrayList的数据也少于10000.
大概原因是:main函数主线程可能存在比子线程提前结束任务.
您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632