多线程:锁对象类型之间的区别

本文关键字:之间 区别 类型 对象 多线程 | 更新日期: 2023-09-27 18:14:07

请解释一下这两种锁的区别。

我有一个List,我想访问线程安全:

var tasks = new List<string>();

1。

var locker = new object();
lock (locker)
{
    tasks.Add("work 1");
}

2。

lock (tasks)
{
    tasks.Add("work 2");
}

我的想法:

  1. 防止两个不同的线程同时运行锁定的代码块。

但是如果另一个线程运行不同的方法,它试图访问task -这种类型的lock将不起作用。

  1. 阻塞List<>实例,因此其他方法中的其他线程将被阻塞,直到我解锁tasks

我是对的还是错的?

多线程:锁对象类型之间的区别

(2)只阻止其他显式调用lock (tasks)的代码。一般来说,只有当您知道tasks是一个私有字段,从而可以在整个类中强制lock (tasks)意味着对列表的锁定操作时,才应该这样做。当锁在概念上与对集合的访问相关联时,这可能是一个很好的捷径,并且您不需要担心锁的公开暴露。不过,你不会"免费"得到这些;它需要显式地使用,就像锁在任何其他对象上一样。

它们做同样的事情。任何其他试图在不锁定同一对象的情况下修改列表的代码都将导致潜在的竞争条件。

更好的方法可能是将列表封装在另一个对象中,该对象在对底层列表执行任何操作之前获得锁,然后任何其他代码都可以简单地调用包装器对象上的方法,而不必担心获得锁。