如何确保静态方法中的线程安全
本文关键字:线程 安全 静态方法 何确保 确保 | 更新日期: 2023-09-27 17:55:39
我需要声明一个静态对象并
像private static readonly Object padlock = new Object()
public static Test()
{
lock(padlock) {
// Blah Blah Blah
}
}
(顺便说一下,你的代码目前无法编译 - Readonly
应该是readonly
的,你需要给padlock
一个类型。
这取决于您在方法中执行的操作。如果该方法不使用任何共享数据,或者以已经安全的方式使用它,那么您没问题。
通常,仅当您以非线程安全的方式访问共享数据时,才需要锁定。(对该共享数据的所有访问都需要以线程安全的方式完成。
话虽如此,我应该指出"线程安全"是一个相当模糊的术语。埃里克·利珀特(Eric Lippert)有一篇很棒的博客文章...与其试图提出"一刀切"的方法,不如考虑一下您要防范什么,预期会出现什么情况等。
Jon 是对的;你在这里问的是什么真的不清楚。 我解释你的问题的方式是:
如果我有一些共享状态需要通过锁定它来使线程安全,我是否需要将私有静态对象声明为锁定对象?
这个问题的答案是否定的,你不需要这样做。但是,这样做是一个非常好的主意,因此即使您不需要,也应该这样做。
你可能会想,嗯,我可以使用很多对象。如果我锁定的对象是引用类型,我可以使用它。或者我可以使用与包含类关联的 Type 对象。
这些东西作为锁的问题在于,很难追踪可能将它用作锁的每个可能的代码位。因此,很难分析代码以确保不会由于锁排序问题而出现死锁。因此,您更有可能陷入僵局。拥有专用的锁定对象使其更容易;您知道该对象的每次使用都是为了锁定,然后您可以了解这些锁内部发生了什么。
如果您的应用程序域中运行了不受信任的恶意代码,则尤其如此。锁定类型对象不需要特定权限;是什么阻止了恶意代码锁定所有类型并且从不解锁它们? 没什么,就是这样。