咋理解集合中线程安全和不安全的问题( 四 )

【咋理解集合中线程安全和不安全的问题】

■网友
这不仅仅是容器的问题,需要了解线程安全性,构建线程安全类等等,推荐《Java并发编程实战》。
■网友
线程安全,即线程同步。在多线程并发访问情况下,当前某一时刻,仅允许一个线程持有对象的锁,执行其代码。执行完毕后,释放锁,其他线程竞争获得该锁,再进行排他性的访问。
■网友
举几个具体的例子吧,大致就是对比了下ArrayList和Vector1.场景一:两个线程同时插入数据到同一ArrayList,主线程等待插入完成之后打印集合结果:执行多次主函数之后发现集合中有部分索引位置的元素为null,这应该是因为底层维护的是数组,而当某一线程正在执行add方法时,另一线程也进入到add方法中执行,覆盖了之前线程的操作,相当于跳过了之前线程的add执行结论:当多个线程插入数据到同一ArrayList时,可能会导致某些数据插入失败,此时应该使用Vector,Vector add()方法会针对多个线程产生互斥作用,避免不会产生数据错误(null值)2.场景二:两个线程其中一个插入数据到ArrayList,另一个线程在列表尾端取出元素并移除结果:执行多次主函数之后仍然发现取出元素的线程会拿到null值,这应该是因为第一个线程执行add方法还没有结束的时候,第二个线程就已经开始读取元素并移除元素导致的结论:当多个线程对同一ArrayList同时执行add和get时,可能会导致get得到的元素为空,此时应该使用Vector,Vector类中的同步方法会对多种不同的操作进行线程同步,避免数据错误


推荐阅读