如何在Delphi中实现"双重检查锁定"?

mjn*_*mjn 5 delphi singleton design-patterns thread-safety double-checked-locking

在C#中,以下代码(来自页面)可用于以线程安全的方式懒惰地实例化单例类:

  class Foo {
        private volatile Helper helper = null;
        public Helper getHelper() {
            if (helper == null) {
                lock(this) {
                    if (helper == null)
                        helper = new Helper();
                }
            }
            return helper;
        }
    }
Run Code Online (Sandbox Code Playgroud)

什么是等效的线程安全Delphi代码?


文章还提到了Java中双重检查锁定的两个问题:

  • 有可能在辅助引用指向新创建的对象之前构造新对象,这意味着创建了两个对象
  • 当对象仍在创建时,辅助引用可能指向内存块,这意味着将返回对不完整对象的引用

因此,虽然上述文章中的C#代码和Java版本看起来几乎相同,但只有C#版本按预期工作.如果在Delphi版本的Double-Checked Locking中也存在这两个问题,那么会引出另外一个问题?

jac*_*ate 7

使用System.TMonitor以线程安全的方式锁定对象实例.

function TFoo.GetHelper(): THelper;
begin
  if not Assigned(FHelper) then
  begin
    System.MonitorEnter(Self);
    try
      if not Assigned(FHelper) then
        FHelper := THelper.Create();
    finally
      System.MonitorExit(Self);
    end;
  end;
  Result := FHelper;
end;
Run Code Online (Sandbox Code Playgroud)

如需进一步参考,请查看锁定我的对象...... 来自Allen Bauer.事实上,代表.我从这里收集应该去艾伦.