gpt4 book ai didi

c# - 锁定传递的对象会发生什么?

转载 作者:太空宇宙 更新时间:2023-11-03 17:49:49 25 4
gpt4 key购买 nike

我在一个项目中使用线程。我正在尝试创建一个不会“破坏”数据的安全线程。我的线程在后台运行并调用另一个类的函数,我可以调用 Go 和 Go2,一个函数从列表中添加和删除。我不希望他们同时运行,下面的情况有什么区别:

static readonly object _locker1 = new object();
static readonly object _locker2 = new object();


public void Go(Object something)
{
lock (_locker1)
{
myList.add(something);
}
}

public void Go2(Object something)
{
lock (_locker2)
{
myList.Remove(something);
}
}

如果我将 Go2 替换为:

public void Go2(Object something)
{
lock (_locker1)
{
myList.Remove(something);
}
}

注意锁定参数。

第三种情况可以帮助我理解,假设我从另一个线程 (thread2) 调用 Go,它能否运行,因为 _locker1 被 thread2 锁定,而 Go2(具有被 thread2 锁定的 _locker 1)被调用线程 1?

static readonly object _locker1 = new object();
static readonly object _locker2 = new object();


public void Go(Object something)
{
lock (_locker1)
{
//Can I call Go2 which is locked by the same object?
Go2(something);
}
}

public void Go2(Object something)
{
lock (_locker1)
{
myList.Remove(something);
}
}

谁能解释传递给 lock 的值的作用?

最佳答案

很简单:如果两个锁使用同一个对象,它们就不会同时运行。在您的第一个片段中,由于 Go 和 Go2 锁定不同的对象,它们可能同时运行并做坏事。

关于c# - 锁定传递的对象会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34601013/

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