静态方法是否是线程安全的?

时间:2015-08-25 14:14:02

标签: c# .net multithreading

我正在阅读此stackoverflow帖子,该示例代码为:

static void modifySharedResource(SomeClass sc)
    {
        //do something
        lock (_lock)
        {
            //where sc is modified
        }
    }

我很好奇,为什么这个静态方法需要锁定,这个样本中的静态方法是否是线程安全的?

我也读过post,但我不明白答案。

有人可以提供有关我问题的更多详细信息,谢谢!

3 个答案:

答案 0 :(得分:2)

方法是否是线程安全的取决于它是否访问共享资源(e.x静态变量,...)。该方法是否是静态无关。

在您的情况下,它不确定是否修改sc是否是线程安全的。它取决于如何创建此参数并将其传递给方法。在大多数情况下,如果传入的参数是共享的,则会出现问题。当我们开发一个函数时,无论函数如何使用都应该确保没有问题。

使用lock(我假设_lock是一个静态变量),如果sc被共享和修改,您仍然实现线程安全在另一个线程的其他地方。

使用名为modifySharedResource的方法(参数共享),我很确定如果参数也在另一个线程上的其他位置被修改,则会出现问题。

通常,修改传入参数是一种不好的做法:https://softwareengineering.stackexchange.com/questions/245767/is-it-an-antipattern-modifying-an-incoming-parameter

答案 1 :(得分:0)

你对线程安全存在误解,关键字lock标记位自己参数的同步块索引(代码中为_lock),另一个lock无法通过,直到其他锁定释放_lock和还原位

答案 2 :(得分:-1)

这里的问题是SomeClass不是线程安全的。你在这里使用的静态方法是线程安全的。