我正在阅读此stackoverflow帖子,该示例代码为:
static void modifySharedResource(SomeClass sc)
{
//do something
lock (_lock)
{
//where sc is modified
}
}
我很好奇,为什么这个静态方法需要锁定,这个样本中的静态方法是否是线程安全的?
我也读过post,但我不明白答案。
有人可以提供有关我问题的更多详细信息,谢谢!
答案 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
不是线程安全的。你在这里使用的静态方法是线程安全的。