问题描述 投票:0回答:1
C#中的RE-RENTRANT锁
我在stackoverflow和

Mmsdn上看了这里,不敢相信我找不到这个问题在互联网上徘徊。 Llet说我有一个与私人成员的课程,我想在几种公共方法中访问。这些公共方法将通过不同的线程调用,因此需要同步。
public class MyClass { private Object SomeSharedData = new Object(); public void MethodA() { lock( SomeSharedData) { // do something MethodB(); } } public void MethodB() { lock( SomeSharedData) { // do something } } } 注意,该类的用户可以调用

MethodA

MethodB,但是Methoda也调用MethodB,这会导致嵌套的锁定条件。 这保证是安全的吗? 换句话说,.NET是否通过参考计算锁来处理此操作,以便当我从这些方法中弹出时,锁会减少? 还是.net在幕后执行一些魔术,从而简单地忽略了来自同一线程的对象上的所有后续锁?

yyes,基于.NET in的锁是递归的,并计数。
从文档for

Monitor

它是合法的,对于同一线程 没有它不止一次调用 阻塞;但是,数量相等 必须调用退出电话 其他线程在物体上等待 会取消阻止

c# .net multithreading synchronization locking
1个回答
22
投票

yyes,
Monitor

支持递归,但是您应该意识到,因为此行为与另一个同步原始化不同。

,例如,ReaderWriterlockslim

默认情况下不支持递归,此代码片段引发了例外:
Monitor.Enter

© www.soinside.com 2019 - 2025. All rights reserved.