如何同时读取和写入ArrayList

时间:2012-06-25 10:53:14

标签: java multithreading

我有两个线程t1和t2访问ArrayList

我希望线程能够访问它,除非它们在相同的索引上进行读写。

如何在不使用任何并发api和java 5的集合的情况下完成它?

5 个答案:

答案 0 :(得分:2)

好吧,在正确的程序中,您无法在多个线程之间共享可变对象,也不能使用任何同步。在不知道你的应用程序做什么的情况下,很难找到某种有用的答案。也许您可以在线程之间拆分ArrayList,以便每个线程都可以使用自己的版本,然后再连接结果。或者,如果您正在实现生产者 - 消费者方案,则可以取消几个Java监视器和ArrayList的现成实现。

答案 1 :(得分:1)

即使两个线程不能同时访问同一个索引,如果重新分配Array也可能存在问题,参见 ArrayList.ensureCapacity

答案 2 :(得分:1)

This可能是一个非常好的起点。了解一些问题如何得到解决将真正有所帮助。 This book以及looking through this也会有所帮助。

答案 3 :(得分:1)

这对你没有帮助 - Collections.synchronizedList上课。

答案 4 :(得分:1)

我会考虑以下事项:
A.将您的数据结构更改为ArrayList的映射(比如说 - 一个包含10个条目的映射),以减少ArrayList上的锁定时间(使用对象的hashCode()%10,以便执行对正确的ArrayList的访问在地图上举行 每个映射条目中的ArrayList将是同步的(您可以使用Collections.synchronizedList获得它的同步版本



B.使用ReaderWriterLock以更好地锁定您的应用程序。使用它的缺点是你必须使用任何使用ArrayList的scneario并了解你是否需要锁定读取或锁定以便写入

C.组合A和B


但是,在许多情况下 - 正确的同步策略依赖于用例 - 您是否希望拥有更多的读者而不是写入?如果是这样,请使用ReaderWriterLock,否则--Rw锁定可能对您没有帮助。