黑马程序员技术交流社区

标题: 张孝祥老师的交通灯是不是有问题? [打印本页]

作者: slatop@qq.com    时间: 2013-6-26 19:40
标题: 张孝祥老师的交通灯是不是有问题?
 刚开始看交通灯,上来Road类里面开了两个线程,同时操作存车的list集合。却没有做同步。
作者: 张承富    时间: 2013-6-26 20:14
这里涉及到了线程池Executors,虽然不是太了解,但是既然张老师没用,就说明线程池已经解决了你所说的问题
作者: 张承富    时间: 2013-6-26 20:16
而且通过运行代码可以知道,4组灯一个循环,车辆是累计增加的,说明线程池起作用了
作者: slatop@qq.com    时间: 2013-6-27 02:52
我使用线程池做了测试,线程池并不产生同步效果。这个是肯定的。

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

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


Array集合采取的是数组线形结构,当集合中有一个元素插入或删除,那么集合内其后所有元素都要跟着移动,这也是Array集合最大的弊端,假如remove后集合内部正在移动这些元素,结果突然另一个线程进来又在最后插了一个元素,那么结果将会是出来一个元素为空或重复元素的情况。当然这种情况是我们无法模拟的测试不出来,因为即使发生机率也非常小。但是一但发现后果是不可想象的。如果是LinkedLIst的话两个线程只是单一头删尾加应该不会有什么问题,但就是如此如果LinkedList里只有一个元素,而且在这个时间正好两个线程同时增加和删除了,后果也是存在的,有可能出现一个元素的某个节点指向了一个已经被回收的内存空间。这是会让程序崩溃的现象。
作者: srain2010    时间: 2013-9-10 19:42
终于找到个想法跟我一样的,我也觉得张老师写得有问题,没同步控制绝对不对




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2