0

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

我希望线程能够访问它,除非它们在同一个索引上读写。

在不使用任何并发 api 和 java 5 集合的情况下如何做到这一点?

4

5 回答 5

2

好吧,在一个正确的程序中,您不能在多个线程之间共享一个可变对象并且不使用任何同步。如果不知道您的应用程序做了什么,就很难想出某种有用的答案。也许您可以ArrayList在线程之间拆分,以便每个线程都可以使用自己的版本,然后将结果连接起来。或者,如果您正在实现生产者-消费者场景,则可以取消几个 java 监视器和一个现成的ArrayList.

于 2012-06-25T11:23:49.183 回答
1

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

于 2012-06-25T11:00:24.027 回答
1

可能是一个非常好的起点。仔细研究其中一些问题是如何解决的,真的会有所帮助。这本书 以及通读这本书也会有所帮助。

于 2012-06-25T11:05:52.930 回答
1

它对您没有帮助吗 - Collections.synchronizedList类。

于 2012-06-25T11:47:59.223 回答
1

我会考虑以下几点:
A. 将您的数据结构更改为 ArrayList 的映射(比方说 - 10 个条目的映射),以减少 ArrayList 上的锁定时间(使用对象的 hashCode() % 10 来执行访问到地图中保存的正确 ArrayList
每个地图条目中的 ArrayList 将被同步(您可以使用 Collections.synchronizedList

B 获得它的同步版本。使用 ReaderWriterLock 以便更好地锁定您的应用程序。缺点使用它,您必须继续使用 ArrayList 的任何场景,并了解是否需要锁定读取或锁定写入

C. 组合 A 和 B



然而,在许多情况下——正确的同步策略依赖于用例——你是否期望读取器比写入器多?如果是这样,请使用 ReaderWriterLock,如果不是 - Rw 锁可能对您没有帮助。

于 2012-06-25T15:23:34.950 回答