要在Java中使用内部锁定,请执行以下操作
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>中
发布于 2016-09-08 07:03:13
根据访问模式,您可以通过对数据结构进行分段并使用单个固有锁来保护多个元素,从而用更少的锁来增加并发性。java.util.concurrent包中提供的一些并发集合中使用了这种技术。
“我是不是可以用2个嵌套锁来表示4个条目,或者用3个来表示8个条目,等等?”听起来您计划将每个锁视为条目索引中的一位:如果设置了位,则获取锁;如果清除,则跳过它。这行不通的。考虑索引0。不会获得锁,也不会有并发控制。
您可以通过将锁的数量增加一倍来使其“工作”(为每个位设置一个“设置”和“清除”锁),但这仍然不是一个好主意,因为这样会浪费锁并获得非常差的并发性。最外层的锁将保护一半的条目。随后获得的任何嵌套锁都将是无用的,因为其他线程已经被排除在该段之外。
这会让您回到数据分段,每个段一个锁,就像java.util.concurrency所做的那样。
发布于 2016-09-08 06:11:24
要获得一个监视器,你需要一个对象,所以要获得你想要的功能,比如锁定一组原始值,你需要一个用于该集合的对象。
只需为值集创建对象,而不是创建一个值数组并将值块视为一个集合,并为监视器使用单独的Object。
这是面向对象的方式。
https://stackoverflow.com/questions/39379496
复制相似问题