java - 监视器锁的最低字节使用值是多少?

标签 java multithreading locking

要在 Java 中使用内部锁定

Object o = new Object()
...
sychronized (o) {
 ...
}

所以一台显示器已经需要一个对象即8 bytes or 16 bytes for 64bit (或 12 个字节用于压缩操作和 64 位)。

现在假设你想使用很多这样的显示器,例如对于 array which one can synchronize over certain areas并且具有比 Collections.synchronizedList 更好的并发性(基于条目) .那么实现这个最有效的方法是什么?我可以以某种方式对 4 个条目使用 2 个嵌套锁,或者对 8 个条目使用 3 个嵌套锁吗?或者我可以使用“每个线程一个锁”,例如在ConcurrentHashMap<array_index, lock>

最佳答案

根据访问模式,您可以通过对数据结构进行分段并使用单个内在锁来保护多个元素,从而以更少的锁来提高并发性。 java.util.concurrent 包中提供的一些并发集合中使用了此技术。

“我能否以某种方式对 4 个条目使用 2 个嵌套锁,或者对 8 个条目使用 3 个嵌套锁,等等?”听起来您打算将每个锁都当作条目索引中的一个位来对待:如果该位已设置,则获取锁;如果该位已设置,则获取该锁;如果很清楚,请跳过它。这行不通。想想索引 0。不会获取任何锁,您也没有并发控制。

您可以通过将锁的数量加倍(为每个位设置一个“设置”和“清除”锁)来使其“工作”,但这仍然是一个坏主意,因为您会浪费锁并获得非常差的并发性.最外面的锁将保护一半的条目。随后获取的任何嵌套锁都将无用,因为其他线程已被排除在该段之外。

这会让您回到对数据进行分段,每个分段使用一个锁,就像 java.util.concurrency 所做的那样。

关于java - 监视器锁的最低字节使用值是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39379496/

相关文章:

c - 锁定 OMP 区域

sql - 仅提交在 TRANSACTION 中可能回滚的特定更改

java - executor.invokeAll() lambda 体不返回

multithreading - iOS 上的 GCD 可以处理数百个已调度的 block 吗?

java - 使用 jsch 自动向下滚动 shell

java - ExecutorService - 并行运行任务并保存结果

c# - 如何异步启动线程?

linux - 自旋锁真的需要 DMB 吗?

java - IText PDF 页边距边框

java - DataOutputStream 空指针异常