突发奇想,大家知道c# lock锁跟踪对象最好是用的私有静态只读引用类型,只读是为了防止对锁的修改,那么假设不设置锁跟踪对象为只读,在进入了互斥的代码段后,对锁跟踪对象的值进行修改进行修改,会导致锁跟踪对象发生什么?为什么会导致锁失效畅通无阻呢?
private static lockerClass locker = new lockerClass (){a=1};//创建锁
lock (locker)//加锁
{
locker.a=2;
}
底层是利用操作系统的临界区实现的,这是核心
他可以理解为“领地”的,你派人监视他,结果他换人了或者换地方了,还怎么监视
底层是利用操作系统的临界区实现的,你lock更换以后,就自然不能识别了。
设置locker.a=2会导致锁失效,真的吗,你试了吗?
为什么锁要用引用类型,就是因为引用类型的值是个地址,类似指针
你修改类下面的属性不会对类本身的地址造成任何影响,也不存在两个实例的地址相同的情况
而如果你使用了字符串之类的变量,那很可能造成多个锁值一致,导致死锁
一般来说,locker定义成object类型就可以,不一定非要是一个自定义class
其实设置只读只不过是用来防脑抽的,一个精神正常的人都不会没事找事的给locker赋值
设置静态是为了在多线程下访问的必须是同一个实例,而不是各锁各的,那跟没锁一样
该回答引用GPTᴼᴾᴱᴺᴬᴵ
在使用 lock 语句时,需要传入一个对象作为锁的跟踪对象,当有多个线程同时访问该代码段时,只有一个线程能够获取到锁,进入该代码段,其他线程则需要等待。
·
对于锁跟踪对象进行修改的情况,如果锁跟踪对象是可变的,那么锁的机制将失效,因为锁跟踪对象的引用会发生变化,导致其他线程无法获得该锁,从而失去了互斥的效果。此时,会出现多个线程同时进入该代码段的情况,导致线程安全问题。
·
因此,建议在使用 lock 语句时,使用私有静态只读引用类型作为锁跟踪对象,确保对象引用不会被修改,从而保证锁的机制生效。
如果锁定跟踪对象在进入互斥代码块后被修改,将导致锁定无效,并允许多个线程同时访问同一资源。这是因为锁是基于对象的引用的,修改对象的值会更改其引用,从而使锁无效。因此,对锁跟踪对象使用私有静态只读引用类型以防止对其值进行任何修改是很重要的。