我有两个线程t1和t2访问ArrayList
。
我希望线程能够访问它,除非它们在相同的索引上进行读写。
如何在不使用任何并发api和java 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锁定可能对您没有帮助。