c# - 为什么要对单独的对象执行锁定?

标签 c# .net locking thread-safety

<分区>

Possible Duplicate:
Difference between lock(locker) and lock(variable_which_I_am_using)

在我见过的所有“线程安全”代码示例中,它们都锁定在一个单独的虚拟对象上。为什么不能直接对有问题的数据执行锁定?

最佳答案

锁定一个单独的 private 虚拟对象可以保证没有其他人锁定该对象。

如果您锁定数据,而同一数据对外部可见,您就失去了这种保证。例如:

public class MyObject
{
    public void SharedMethod()
    {
        lock (this)
        {
            // Do stuff
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        MyObject o = new MyObject();

        lock (o)
        {
            new Thread(() =>
            {
                // Gets blocked 2s because of external lock
                o.SharedMethod();
            }).Start();

            Thread.Sleep(2000);
        }
    }
}

关于c# - 为什么要对单独的对象执行锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1873201/

相关文章:

c# - 在 ListView 中存储隐藏值(id)

c# - 制作按钮 Xna/MonoGame

c# - blazor 中的 RenderMode.Server 和 RenderMode.ServerPrerendered 有什么区别?

c# - 冗余转换是否得到优化?

c# - 使用 HttpClient 区分超时和无服务器响应

c# - FileStream.Dispose 就够了吗?

c# - 使用 GDI+ 创建具有透明背景的图像?

c# - 删除 'ext:CalendarPanel' 中的所有事件

t-sql - 分离数据库/脱机失败

C# Lock 不允许关键代码正确运行