Ben*_*dEg 4 .net c# multithreading locking
我有一个关于锁定c#的问题.c#是否锁定对象或成员的实例.
如果我有以下代码:
lock(testVar)
{
testVar = testVar.Where(Item => Item.Value == 1).ToList();
//... do some more stuff
}
Run Code Online (Sandbox Code Playgroud)
c#是否保持锁定,即使我设置testVar为新值?
所有C#对象都继承自System.Object,它本身总是包含4个字节,专门用于使用语法糖时使用lock.这叫做SyncBlock对象.
当您使用生成对a的新引用的new情况创建新对象时,实际上是覆盖旧引用,这会使您的引用无效.这意味着现在多个线程可能在你的内部.编译器会将您的代码转换为具有额外局部变量的块,以避免您射击您的腿.ToListList<T>locklocktry-finally
这就是为什么最佳实践是定义一个专用的私有只读变量,它将充当同步根对象,而不是使用类成员.这样,任何阅读代码的人都清楚你的意图.
编辑:
SyncTableEntry还存储一个指向SyncBlock的指针,该指针包含有用的信息,但很少需要对象的所有实例.此信息包括对象的锁,其哈希码,任何thunking数据及其AppDomain索引.对于大多数对象实例,将不会为实际的SyncBlock分配存储空间,并且syncblk数字将为零.当执行线程命中诸如lock(obj)或obj.GetHashCode之类的语句时,这将改变.
