c# - 用函数参数对象锁定函数体

标签 c# multithreading locking thread-safety methodimplattribute

今天看到这段代码

internal  object UpdatePracownik(object employee)
{  
    lock (employee)
    {
        // rest of the code 
    }

    return employee;
}

我想知道这是否是锁定功能访问的有效解决方案?

使用属性不会更好

[MethodImpl(MethodImplOptions.Synchronized)] 

而不是这种锁?

最佳答案

嗯,这取决于。如果所有线程都通过传递相同的全局可见对象作为参数来调用此方法,那么它们都会看到相同的锁,并且不会出现问题。

如果相反,每个线程都将通过传递自己的对象来调用此方法,那么锁定是无用的,因为它们都看到不同的锁。我们必须知道调用该方法的上下文,以查看这是否安全。

使用您提出的同步方法可以将整个方法体包裹在一个lock(this)语句中,如下所示:

internal  object UpdatePracownik(object employee)
{
    lock (this)
    {
        // code        
    }
}

这将保证多个线程执行的原子性,但对于您的目的来说可能过于粗粒度,通常不建议使用。

关于c# - 用函数参数对象锁定函数体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8910366/

相关文章:

c# Entity Framework 与线程

c# - AutoResetEvent澄清

java - 同步属性读取为非同步属性

python - 锁定多处理包不起作用

Python:有没有一种线程安全的方法来知道lock.acquire()是否已阻塞(并继续阻塞)?

c# - 使用闭包而不是共享状态锁的优点和缺点是什么?

c# - 如何使用标准用户检索 Junction 或 Symlink 的目标

c# - ping 多个 IP 会使我的网络繁忙吗?

c# - 未选中匿名访问时无法访问该网站

c# - JwtSecurityTokenHandler 和 TokenValidationParameters