Tag: lock free

volatile是否会阻止引入读取或写入?

在C#中, volatile关键字分别确保读取和写入具有获取和释放语义。 但是,是否有关于引入读取或写入的内容? 例如: volatile Thing something; volatile int aNumber; void Method() { // Are these lines… var local = something; if (local != null) local.DoThings(); // …guaranteed not to be transformed into these by compiler, jitter or processor? if (something != null) something.DoThings(); // <– Second read! // Are these lines… if (aNumber == […]

在深度不可变类型上进行延迟初始化是否需要锁定?

如果我有一个非常不可变的类型(所有成员都是只读的,如果它们是引用类型成员,那么它们也引用了非常不可变的对象)。 我想在类型上实现一个惰性初始化属性,如下所示: private ReadOnlyCollection m_PropName = null; public ReadOnlyCollection PropName { get { if(null == m_PropName) { ReadOnlyCollection temp = /* do lazy init */; m_PropName = temp; } return m_PropName; } } 据我所知: m_PropName = temp; ……是线程安全的。 我并不担心两个线程同时竞争初始化,因为它很少见,从逻辑角度来看两个结果都是相同的,如果我没有,我宁愿不使用锁至。 这会有用吗? 优缺点都有什么? 编辑:谢谢你的回答。 我可能会继续使用锁。 但是,我很惊讶没有人提出编译器意识到临时变量是不必要的可能性,只是直接分配给m_PropName。 如果是这种情况,则读取线程可能会读取尚未完成构造的对象。 编译器是否会阻止这种情况? (答案似乎表明运行时不会允许这种情况发生。) 编辑:所以我决定使用由Joe Duffy撰写的这篇文章启发的Interlocked CompareExchange方法。 基本上: private ReadOnlyCollection m_PropName = […]