静态方法是线程安全的吗?
本文关键字:安全 线程 静态方法 | 更新日期: 2023-09-27 18:09:40
我正在阅读这个stackoverflow帖子,它给出了示例代码:
static void modifySharedResource(SomeClass sc)
{
//do something
lock (_lock)
{
//where sc is modified
}
}
我很好奇,为什么这个静态方法需要一个锁,静态方法在这个例子中线程安全吗?
我也读了这篇文章,但是我不明白答案。
谁能给我的问题更详细的信息,谢谢!
方法是否线程安全取决于它是否访问共享资源(例如静态变量,…)。方法是否是静态的与此无关。
在您的情况下,不能确定修改sc
是否线程安全。这取决于如何创建该参数并将其传递给方法。在大多数情况下,如果传入的参数是共享的,则会出现问题。当我们开发一个函数时,我们应该确保无论如何使用该函数都不会出现问题。
与您的lock
(我假设_lock
是一个静态变量),您仍然不实现线程安全,如果sc
在另一个线程上共享和修改。
使用名为modifySharedResource
的方法(参数是共享),我很确定如果参数在另一个线程的其他地方也被修改,则存在问题。
一般来说,修改传入参数是一种不好的做法:https://softwareengineering.stackexchange.com/questions/245767/is-it-an-antipattern-modifying-an-incoming-parameter
你对线程安全有一个误解,关键字lock
在自己的参数(代码中的_lock)的同步块索引中标记位,另一个lock
不能通过,直到其他锁释放_lock并恢复位
这里的问题是SomeClass
不是线程安全的。这里的静态方法是线程安全的。