gpt4 book ai didi

c# - 如果实例可公开访问,则使用 lock(this)

转载 作者:行者123 更新时间:2023-11-30 19:24:05 25 4
gpt4 key购买 nike

如果实例可公开访问,我正在查看不在锁中使用“this”的答案。我尝试了下面的示例,我认为 Method1 不会被调用,因为实例的 Main 方法中已经获取了锁。但是Method1调用Method2无限期等待。对此的解释将不胜感激。

class Program
{
static void Main(string[] args)
{
Tracker tracker = new Tracker();
lock (tracker)
{
Parallel.Invoke(() => tracker.Method1(),
() => tracker.Method2());
}
}
}

class Tracker
{
private int number = 6;
public void Method1()
{
lock (this)
{
number *= 5;
Console.WriteLine("Method1: " + number);
number /= 4;
Console.WriteLine("Method1: " + number);
}
}

public void Method2()
{
lock (this)
{
number *= 3;
Console.WriteLine("Method2: " + number);
number /= 2;
Console.WriteLine("Method2: " + number);
}
}
}

最佳答案

锁定一个可公开访问的对象并非不可能,这只是一个非常糟糕的想法,因为它使理解对象的同步很多变得更加困难。一般的做法是永远不要锁定在当前类型范围之外可以访问的对象,因为这样可以很容易地跟踪所有可能获得锁的位置,这使得更容易诊断潜在的同步问题,并在查看代码时了解同步的内容。

当您在一个公开的对象上进行同步时,它将工作,这只是意味着如果您遇到问题,您有一个巨大的空间可以查看通过尝试找出有问题的交互是什么。当位于非常不同位置的大量不同代码都与一个被锁定的对象交互时,它也更容易导致死锁。

关于c# - 如果实例可公开访问,则使用 lock(this),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40089796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com