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()的任何地方)。

C# 监视器(来自 Java 开发人员 POV)

lock(x) 是 Monitor.Enter 然后 Monitor.Exit 的迭代。这是一个语言快捷方式。

如果你问我,它是 C# 语言中较弱的部分之一 - 仅仅是因为虽然在有 MINOTIR 时它很好,但现在有各种版本的显示器(苗条、旋转锁等),锁只支持其中之一。这很方便,但我不确定这是否明智;)

是额外的 PulseAll() 像 notifyAll() 来唤醒所有线程 等待资源?(但我在代码中找不到任何地方 其中调用 Monitor.Wait()。

除非您有明确的等待,否则 PulseAll 毫无意义,可能是来自其他不想进入的线程。 如果无法锁定,则输入等待,因此退出足以进行正常同步。

我会开始寻找等待或其他东西 - MOnitor 上的 PulseAll 只有在您有线程等待而在此阶段尝试进入时才有意义。这可能会导致一个糟糕的设计问题,基本上让他们等待然后脉冲然后尝试进入,它可能是某种非阻塞设计的一部分 - 很难说,但这是不寻常的。除非你能在你的代码中找到一个等待,否则我可能会尝试杀死PulseAll,看看会发生什么。