【问题标题】:Synchronization with intrinsic locks与内在锁同步
【发布时间】:2015-12-22 06:51:32
【问题描述】:

我正在阅读B. Goetz's Java concurrency in pratice,现在我正在阅读关于锁定的部分。他说

每个对象都有一个内置锁只是为了方便 这样您就无需显式创建锁定对象。9

9 回想起来,这个设计决定可能是一个糟糕的决定:它不仅会令人困惑,而且会迫使 JVM 实现者做出 对象大小和锁定性能之间的权衡。

因为,我是并发新手,所以不清楚他在谈论什么设计决策。从性能的角度来看,创建显式锁定对象是不好的,不是吗?

【问题讨论】:

  • 每个对象都有一个内置锁的决定。这就是他所说的。
  • 这是我猜不是所有的对象都需要并发锁,所以它消耗更多的内存。有多余的东西总是会影响性能。因为即使您不使用它们,您也需要管理它们。

标签: java multithreading


【解决方案1】:

我自己从未实现过 JVM,甚至没有参与过它的开发,但我可以想象其中的权衡。

将内在锁关联到每个对象的第一个想法就是这样做:将锁及其状态(我是否被哪个线程锁定)关联到在 JVM 中创建的每个对象,与对象状态的其余部分位于同一位置。这应该是高效的,但是,它也使每个创建的对象在内存中占用了额外的空间,并且大部分时间都不会使用该空间(因为同步并不常见,并且大多数对象从不用作锁) .

另一个想法是维护某种单独的惰性字典,仅当该对象实际用作锁时才会为该对象创建锁及其状态。这不太明显,并且可能效率较低,因为字典需要与对象并行维护等。但它会使用更少的内存空间。

因此,我认为这就是 Brian Goetz 所说的权衡(或部分权衡)。如果只有特定的对象可以充当锁,它确实会不那么令人困惑,并且实现可能会更简单。

【讨论】:

  • 啊,现在我看到了权衡。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
  • 1970-01-01
相关资源
最近更新 更多