A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

 刚开始看交通灯,上来Road类里面开了两个线程,同时操作存车的list集合。却没有做同步。

4 个回复

正序浏览
终于找到个想法跟我一样的,我也觉得张老师写得有问题,没同步控制绝对不对
回复 使用道具 举报
我使用线程池做了测试,线程池并不产生同步效果。这个是肯定的。

唯一不能肯定的就是list集合内部的操作过程。

一个List集合在remove(0)后,那么他后面的元素是全部向前移,还是说自动将集合里的第一个元素指针向后移。这个是关键问题。


Array集合采取的是数组线形结构,当集合中有一个元素插入或删除,那么集合内其后所有元素都要跟着移动,这也是Array集合最大的弊端,假如remove后集合内部正在移动这些元素,结果突然另一个线程进来又在最后插了一个元素,那么结果将会是出来一个元素为空或重复元素的情况。当然这种情况是我们无法模拟的测试不出来,因为即使发生机率也非常小。但是一但发现后果是不可想象的。如果是LinkedLIst的话两个线程只是单一头删尾加应该不会有什么问题,但就是如此如果LinkedList里只有一个元素,而且在这个时间正好两个线程同时增加和删除了,后果也是存在的,有可能出现一个元素的某个节点指向了一个已经被回收的内存空间。这是会让程序崩溃的现象。
回复 使用道具 举报 1 0
而且通过运行代码可以知道,4组灯一个循环,车辆是累计增加的,说明线程池起作用了
回复 使用道具 举报
这里涉及到了线程池Executors,虽然不是太了解,但是既然张老师没用,就说明线程池已经解决了你所说的问题
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马