C# 监视器(来自 Java 开发人员 POV)
本文关键字:POV 开发 Java 监视器 来自 | 更新日期: 2023-09-27 18:36:05
我正在研究将C#/directx游戏客户端移植到Java,这样我就可以学习一些C#(因为我完全亵渎了它),同时提高我对Java opengl引擎的了解。
当我遇到类似以下内容时:
Monitor.Enter(preloadDictionary);
try {
foreach (PreloadEntry entry in preloadDictionary.Values) {
if (entry.loaded) continue;
return entry;
}
} finally {
Monitor.Exit(preloadDictionary);
}
我可以假设它是这样的吗?
syncronized(preloadDictionary) {
[...]
}
在以下情况下:
Monitor.Enter(worldServerMap);
try {
worldServerMap[rv.WorldName] = entry;
Monitor.PulseAll(worldServerMap);
} finally {
Monitor.Exit(worldServerMap);
}
额外的PulseAll()
是否像唤醒等待资源的所有线程的notifyAll()
?(但我在代码中找不到调用Monitor.Wait()
的任何地方)。
lock(x) 是 Monitor.Enter 然后 Monitor.Exit 的迭代。这是一个语言快捷方式。
如果你问我,它是 C# 语言中较弱的部分之一 - 仅仅是因为虽然在有 MINOTIR 时它很好,但现在有各种版本的显示器(苗条、旋转锁等),锁只支持其中之一。这很方便,但我不确定这是否明智;)
是额外的 PulseAll() 像 notifyAll() 来唤醒所有线程 等待资源?(但我在代码中找不到任何地方 其中调用 Monitor.Wait()。
除非您有明确的等待,否则 PulseAll 毫无意义,可能是来自其他不想进入的线程。 如果无法锁定,则输入等待,因此退出足以进行正常同步。
我会开始寻找等待或其他东西 - MOnitor 上的 PulseAll 只有在您有线程等待而在此阶段尝试进入时才有意义。这可能会导致一个糟糕的设计问题,基本上让他们等待然后脉冲然后尝试进入,它可能是某种非阻塞设计的一部分 - 很难说,但这是不寻常的。除非你能在你的代码中找到一个等待,否则我可能会尝试杀死PulseAll,看看会发生什么。