我有一个大型数组可供多个线程访问。单锁效率不高。在java或scala中有一个范围锁类吗?
答案 0 :(得分:6)
不在标准库中。 ConcurrentHashMap执行此操作,在内部将哈希表表示为“段”(默认情况下为16个),其中每个段都使用单独的锁保护。此外,this thread询问相同的问题,除了有关ArrayList而不是数组。虽然没有结果,但如果你能够在使用上妥协,它会带来替代品。
更新:也许AtomicReferenceArray and friends可以提供您正在寻找的效率,同时“为数组元素提供易变的访问语义” (JCIP 15.3)。
答案 1 :(得分:2)
通常来说,除非你在并发方面有一个非常具体的需求,你会在jdk的java.util.concurrent包中找到非常优化和方便的对象。
我可以推荐Brian Goetz的“Java Concurrency in Practice”,这是一本非常好的书,解释了很多关于java和java.util.concurrent包中的线程的事情。
答案 2 :(得分:1)
将数组包装在控制访问权限的线程安全对象中。您可以自己管理范围,也可以将数组拆分为范围,每个范围都有自己的锁,并以这种方式引用它。
答案 3 :(得分:0)
这实际上取决于您的使用情况。如果你实际上是指 ArrayList 而不仅仅是数组,那么你可能需要自己动手并锁定你的锁,因为ArrayLists可以调整大小,这实际上可以搞砸不同步的读写。
但是,如果你实际上是指一个数组,我不确定我明白你的意思。你不需要锁,没有锁就可以正常工作。另一个线程可能不会立即看到变化,但这不是世界末日。