如果count++是一个耗时操作则会出现内存溢出错误

来源:1-3 并发编程初体验

kenja

2018-06-29

我尝试着设置信号量为500,总请求次数为5000,然后在add()方法里休眠100毫秒,这样运行起来后导致了内存溢出,我猜测这个信号量设置后如果有超过信号量的请求进来,就会导致内存溢出,望老师解惑

http://img.mukewang.com/szimg/5b35069f0001ef1004170147.jpg

http://img.mukewang.com/szimg/5b3506a000011ea006600146.jpg


写回答

1回答

Jimin

2018-06-29

你好,并不是你猜测的那样,这里因为有sleep存在,导致同一时间是有大量线程存在的,而每个线程都要占申请相应的内存空间和资源,这时候就可能出现操作系统已经无法提供足够的内存和资源了,同时还有一种可能,就是操作系统设置了应用创建线程的最大数量,并且已经达到了最大允许数量

0
1
kenja
非常感谢!感谢老师的解答,我理解错了信号量的作用,以为达到数量后线程会停止继续创建,但这里信号量的限制是允许同一时间规定数量的线程活动,超过则刮起,所以当进行耗时操作后,线程池会因为前面的线程没有执行完而创建了比之前更多的线程数,导致了oom
2018-06-29
共1条回复

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程