gpt4 book ai didi

c# - 由目标对象自身锁定

转载 作者:行者123 更新时间:2023-11-30 14:07:29 25 4
gpt4 key购买 nike

我很好奇下面两个例子的区别。

情况 1)由只读对象锁定

private readonly object key = new object();
private List<int> list = new List<int>;
private void foo()
{
lock(key){
list.add(1);
}
}

case2) 目标对象自身锁定

private List<int> list = new List<int>;
private void foo()
{
lock(list){
list.add(1);
}
}

这两种情况都足够线程安全吗?我想知道垃圾收集器是否在某个时候更改了 list 变量的地址(如 0x382743 => 0x576382),以便它可能会失败线程安全。

最佳答案

只要List<T>在其代码中没有任何 lock(this)这两个函数的语句将表现相同。

但是,因为如果不查看对象的源代码,您并不总是知道对象是否锁定了自身,所以只锁定一个单独的对象会更安全。

请注意,继承自 ICollection 的类有一个 SyncRoot 如果您想在不使用单独对象的情况下锁定集合,则该属性明确是您应该锁定的对象。

private List<int> list = new List<int>;
private void foo()
{
lock(((ICollection)list).SyncRoot){
list.add(1);
}
}

internally只是在做与您所做的相同的事情,并创建了一个单独的 new Object()锁定。

关于c# - 由目标对象自身锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40667849/

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