首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >监视器锁的最低字节使用率值是多少?

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

Stack Overflow用户
提问于 2016-09-08 05:46:19
回答 2查看 92关注 0票数 2

要在Java中使用内部锁定,请执行以下操作

代码语言:javascript
复制
Object o = new Object()
...
sychronized (o) {
 ...
}

因此,一个监视器已经需要一个对象,即8 bytes or 16 bytes for 64bit (对于压缩操作和64位,则为12字节)。

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

EN

回答 2

Stack Overflow用户

发布于 2016-09-08 07:03:13

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

“我是不是可以用2个嵌套锁来表示4个条目,或者用3个来表示8个条目,等等?”听起来您计划将每个锁视为条目索引中的一位:如果设置了位,则获取锁;如果清除,则跳过它。这行不通的。考虑索引0。不会获得锁,也不会有并发控制。

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

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

票数 1
EN

Stack Overflow用户

发布于 2016-09-08 06:11:24

要获得一个监视器,你需要一个对象,所以要获得你想要的功能,比如锁定一组原始值,你需要一个用于该集合的对象。

只需为值集创建对象,而不是创建一个值数组并将值块视为一个集合,并为监视器使用单独的Object

这是面向对象的方式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39379496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档