当前位置: 首页 > 面试题库 >

Java监视器有多重?

阎令
2023-03-14
问题内容

假设我有成千上万个对象的数组,还有少量线程可以访问每个对象。我想保护对一种对象方法的访问。最简单的方法是将该方法声明为synchronized。但是,无论采用哪种实施方式,这都可能导致创建数千个监视器。如果这是Win32,我将永远不会创建数千个内核对象(例如Mutex),但是CRITICAL_SECTIONs
可能
是合理的。我想知道Java中的情况如何。考虑到争用的机会很低,使用监视器会带来比其所需的过多内存更多的负担吗?在Java中使用这种低粒度同步有多普遍?

(显然,有一些变通办法,例如使用更小的同步对象数组,这些对象将使用一些哈希进行访问。我不是在寻找实用的解决方案,而是在寻求洞察力。)


问题答案:

您已经为使用Java配备Monitors付出了(大部分且争夺性很低)的惩罚……没有理由不使用它们。特别是在低竞争的情况下,它们非常便宜(请参阅此处的项目2.1、2.2、2.3和此处的项目#1),JVM可以在许多情况下完全优化它们。如果仅暂时使用对象的监视器,则JVM将使其变得“足够大”(这意味着它以位翻转开始,对于简单的争用情况可能会扩展为堆栈分配的原子标志,并且在持久争用下为该对象分配了对象监视器它;所有这些将在争用减少时退回到低开销的情况),并在以后收回空间。就这些对象上的锁定而言,在应用html" target="_blank">程序方面是“正确的事情”,我会说。

但是,这里有设计气味。锁定这么多对象听起来并不好。此外,如果您有任何顺序锁定条件,您将无法推理潜在的死锁。我建议您用有关该应用程序的更多详细信息来补充您的问题,我们可以问一下锁定大型对象池是否正确。

此演示文稿由Dave骰子给出了一些有益的见解的Java6同步是如何工作的,这博客条目是同步的Java的信息宝库。如果您真的很在乎一个完整的对象监视器结构有多“大”(在有争议的情况下会起作用),请参见此处的代码。HotSpot内部Wiki页面也提供了一些很好的深入信息。



 类似资料:
  • 问题内容: 我的Java应用程序的摘录: 因此,它所做的就是使其自满屏。现在奇怪的是,该程序是全屏的,但只能在一台显示器上!例如,我有一个Windows Vista系统,其中两个屏幕组合在一个桌面上。如何自动让它在所有监视器上全屏显示? 好的,我尝试过: 但它给出: 例如,我希望能将2048x768的设备组合成一个设备(我单击“扩展桌面”)。 问题答案: 您可以尝试: 这应该计算多个屏幕的总宽度。

  • 这一节我们编写一个监视器:EventLogMonitor ,也就是用来接收事件的程序,用来代替 netcat 。EventLogMonitor 做下面事情: 接收 LogEventBroadcaster 广播的 UDP DatagramPacket 解码 LogEvent 消息 输出 LogEvent 消息 和之前一样,将实现自定义 ChannelHandler 的逻辑。图13.4描述了LogEv

  • 问题内容: 我正在用Java编写SAX解析器,以解析Wikipedia文章的2.5GB XML文件。有没有办法监视Java中的解析进度? 问题答案: 用一个

  • 问题内容: Java并发编程中所指的监视器是什么? 当我看到“每个对象都关联了一个监视器”时,这是什么意思? 这是一个特殊的对象吗? 问题答案: 监视器是控制对对象的并发访问的机制。 这使您可以执行以下操作: 线程1: 线程2: 这样可以防止线程1和2同时访问受监视(同步)的部分。一个将启动,并且监视器将阻止另一个在第一个完成之前访问该区域。 这不是一个特殊的对象。它的同步机制位于类层次结构的根目

  • 我的Java代码中有一个问题,它应该模拟pholosophers问题,如下所述:http://en.wikipedia.org/wiki/Dining_philosophers_problem我想输出所有哲学家的当前状态,每次他们中的一个吃饭或思考。输出应该是这样的:“OxOx(2)”,其中“X”表示哲学家在吃,“O”表示他在思考,“O”表示他在等筷子。括号中的数字表示状态已更改的哲学家的编号。我

  • Java SE6文档中的ThreadPoolExecutor类具有以下方法: 返回正在积极执行任务的线程的大致数目。 这里近似和积极执行是什么意思? 在调用之前、期间和之后,是否保证 null 我已经研究了线程池执行器监视需求,以及如何在java中判断线程池中是否有可用的线程,但它们没有回答我的查询。