2010-07-21 56 views
7

我有一个大型数组可供多线程访问。单一锁定效率不够高。在java或scala中是否有范围锁定类?在java中的范围锁定

+0

如果阵列只访问并没有修改,那么你不需要任何类型的锁。 (假设在线程开始读取之前数组已完全填充,以确保发布初始更改。) – mdma 2010-07-21 19:37:13

回答

1

将数组包裹在控制访问的线程安全对象内。您可以自己管理范围,也可以将数组拆分成范围,每个范围都有自己的锁,并以此方式引用它。

6

不在标准库中。 ConcurrentHashMap虽然这样做,内部表示哈希表为“段”(默认情况下16),其中每个用一个单独的锁保护。另外,this thread询问除ArrayList而不是数组之外的相同问题。虽然没有结果,但如果您能够妥协使用,它会提出替代方案。

更新:也许AtomicReferenceArrayandfriends将提供您正在寻找的,而在同一时间它“提供]挥发性访问语义到数组的元素”效率(JCIP 15.3)。

2

Generaly来讲,除非你有并发的任期确实具体需要,你会发现在JDK的java.util.concurrent包非常优化,便捷对象。

我可以建议作者Brian Goetz的“Java并发实践”,一本很好的书解释有关Java和java.util.concurrent包也穿了很多东西。

0

这实际上取决于您的使用情况。如果你实际上意味着的ArrayList并不仅仅是阵列,那么你可能会推出自己和条带你的锁,为的ArrayList可以调整这才能真正搞砸未sychronized读取和写入。

但是,如果实际上您的意思是阵列,我不确定我明白你的意思。你不需要锁,没有锁就能正常工作。另一个线程可能不会马上看到变化,但那不是世界末日。