我有两个线程 t1 和 t2 访问ArrayList
.
我希望线程能够访问它,除非它们在同一个索引上读写。
在不使用任何并发 api 和 java 5 集合的情况下如何做到这一点?
我有两个线程 t1 和 t2 访问ArrayList
.
我希望线程能够访问它,除非它们在同一个索引上读写。
在不使用任何并发 api 和 java 5 集合的情况下如何做到这一点?
好吧,在一个正确的程序中,您不能在多个线程之间共享一个可变对象并且不使用任何同步。如果不知道您的应用程序做了什么,就很难想出某种有用的答案。也许您可以ArrayList
在线程之间拆分,以便每个线程都可以使用自己的版本,然后将结果连接起来。或者,如果您正在实现生产者-消费者场景,则可以取消几个 java 监视器和一个现成的ArrayList
.
即使两个线程不同时访问同一个索引,如果重新分配 Array 也可能会出现问题,参见。ArrayList.ensureCapacity
它对您没有帮助吗 - Collections.synchronizedList类。
我会考虑以下几点:
A. 将您的数据结构更改为 ArrayList 的映射(比方说 - 10 个条目的映射),以减少 ArrayList 上的锁定时间(使用对象的 hashCode() % 10 来执行访问到地图中保存的正确 ArrayList
每个地图条目中的 ArrayList 将被同步(您可以使用 Collections.synchronizedList
B 获得它的同步版本。使用 ReaderWriterLock 以便更好地锁定您的应用程序。缺点使用它,您必须继续使用 ArrayList 的任何场景,并了解是否需要锁定读取或锁定写入
C. 组合 A 和 B
然而,在许多情况下——正确的同步策略依赖于用例——你是否期望读取器比写入器多?如果是这样,请使用 ReaderWriterLock,如果不是 - Rw 锁可能对您没有帮助。