Delphi中TInterfacedObject自动释放及_Release/_AddRef是否线程安全?
Delphi中TInterfacedObject的线程安全性分析
一、_AddRef与_Release方法的线程安全性
_AddRef和_Release对引用计数FRefCount的操作依赖原子指令(InterlockedIncrement/InterlockedDecrement),这部分是线程安全的。原子操作可以确保多个线程同时修改引用计数时,不会出现计数错误的竞态问题,引用计数的数值始终准确。
二、自动释放的线程安全性与Destroy调用的竞态问题
从你提供的_Release实现代码来看:
function TInterfacedObject._Release: Integer; begin Result := InterlockedDecrement(FRefCount); if Result = 0 then Destroy; end;
- 由于
InterlockedDecrement是原子操作,只会有一个线程能得到Result = 0的返回值,因此Destroy方法只会被调用一次,不存在多个线程同时执行Destroy的竞态条件。
三、需要注意的额外场景
虽然引用计数的管理和Destroy的触发是线程安全的,但Destroy方法本身没有锁保护:
- 如果在对象引用计数尚未减至0时,有其他线程在访问该对象的成员变量,而同时某个线程触发了
Destroy,这时候会出现对象成员被释放后仍被访问的竞态问题。这种情况属于业务代码未正确同步对象访问导致的,并非TInterfacedObject引用计数机制本身的问题。
内容的提问来源于stack exchange,提问作者qgi
相关产品推荐
相关产品推荐

