我使用线程池做了测试,线程池并不产生同步效果。这个是肯定的。
唯一不能肯定的就是list集合内部的操作过程。
一个List集合在remove(0)后,那么他后面的元素是全部向前移,还是说自动将集合里的第一个元素指针向后移。这个是关键问题。
Array集合采取的是数组线形结构,当集合中有一个元素插入或删除,那么集合内其后所有元素都要跟着移动,这也是Array集合最大的弊端,假如remove后集合内部正在移动这些元素,结果突然另一个线程进来又在最后插了一个元素,那么结果将会是出来一个元素为空或重复元素的情况。当然这种情况是我们无法模拟的测试不出来,因为即使发生机率也非常小。但是一但发现后果是不可想象的。如果是LinkedLIst的话两个线程只是单一头删尾加应该不会有什么问题,但就是如此如果LinkedList里只有一个元素,而且在这个时间正好两个线程同时增加和删除了,后果也是存在的,有可能出现一个元素的某个节点指向了一个已经被回收的内存空间。这是会让程序崩溃的现象。 |