假设我在某个类中有以下属性,其目的是用作锁。
protected object SyncRoot { get; private set; }
无论如何,不管这是如何设置的,如果它确实被设置了,最佳做法是如何使用它?
由于锁不能与空对象一起使用,我应该像这样处理吗?
lock (SyncRoot ?? new object())
SomeMethod();
或者我应该像这样检查 null 吗?
if (SyncRoot != null)
lock (SyncRoot)
SomeMethod();
else
SomeMethod();
如果它确实被设置了,我想要使用它进行锁定。否则,我不关心它。第一个解决方案是否存在任何低效或冗余的问题?编辑:所有这些答案都很好。然而,我只能选择一个。根据我与Luke讨论的情况,我的SyncRoot没有理由为空。在单线程环境中使用锁的开销不是什么大问题,但在多线程环境中则是必要的。(四位回答者升级了投票)感谢你们快速的回复。
new object()
--为什么你会有不初始化的情况呢?(为什么不在声明时就初始化它,从而默认消除这个问题呢?) - Kirk Woll