era*_*ran 15 java performance synchronization monitor
假设我有一个包含数千个对象的数组,以及可能访问每个对象的少量线程.我想保护对其中一个对象方法的访问.最简单的方法是将该方法声明为synchronized.但是,这可能会导致创建数千个监视器,无论它们是以何种方式实现的.如果这是Win32,我永远不会创建数千个内核对象,如Mutex,但CRITICAL_SECTION 可能是合理的.我想知道Java的情况如何.鉴于争用的可能性很低,监视器的使用是否会超过他们所需的大量内存?在Java中使用这种低粒度同步的做法有多常见?
(显然有一些解决方法,例如使用更小的同步对象数组,可以使用一些哈希来访问.我不是在寻找一个实用的解决方案,我正在寻找一个洞察力).
and*_*soj 14
你已经支付了(大多数,并且在低争用中)使用Java监视器的惩罚...没有意义不使用它们.特别是在低竞争情况下,它们非常便宜(参见此处的第2.1,2.2,2.3 项和第1项),JVM可以在很多情况下完全优化它们.如果你只是暂时使用对象的监视器,那么JVM会使它"足够大"(意味着它从位翻转开始,可能会因为简单的争用情况而扩展到堆栈分配的原子标志,并且在持久争用下会分配一个objectmonitor)它;所有这些都将在争用减少时展开回低开销情况)并稍后回收空间.如果锁定这些对象是应用程序方面的"正确的东西",我会说它去做.
但是,这里有一种设计气味.锁定这么多物体听起来不太好.此外,如果您有任何顺序锁定条件,您将无法推断潜在的死锁.我建议你用关于应用程序的更多细节来扩充你的问题,我们可以问一下锁定大型对象池是否正确.
此演示文稿由Dave骰子给出了一些有益的见解同步如何工作的Java6,这博客条目是同步的Java的信息宝库.如果你真的非常关心一个完整的对象监视器结构是多么"大"(在竞争情况下会发挥作用),代码就在这里.HotSpot内部维基页面也有一些很好的深入信息.
| 归档时间: |
|
| 查看次数: |
1833 次 |
| 最近记录: |