Возможный дубликат:
Заблокированные блокировки на С#
Я посмотрел здесь на StackOverflow и на MSDN, и не могу поверить, что я не мог найти этот вопрос затяжным там, в интернетах.
Скажем, у меня есть класс с частным членом, который я хочу получить в нескольких общедоступных методах. Эти общедоступные методы будут вызываться разными потоками, поэтому требуется синхронизация.
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 выполняет некоторую магию за кулисами, посредством чего она просто игнорирует все последующие блокировки объекта, происходящего из того же потока?