在多线程程序中执行一次初始化时,下面的代码段是否“安全”?
我有点担心拳击/拆箱可能会引起一些问题......
private static object initialized = false;
public static void Initialize()
{
lock (initialized)
{
if ((bool)initialized == false)
{
DoInitialization();
initialized = true;
}
}
}
请注意,我不能只从Main或其他单线程上下文进行初始化。
答案 0 :(得分:4)
你是对的 - 因为你正在重新分配你要锁定的对象,所以不会起作用。
您可以使用两个单独的成员执行此操作 - 锁定的对象仅分配一次,然后是您可以读取或分配的布尔值(锁定后)。
您可能还想考虑singleton是否合适。
答案 1 :(得分:3)
private static volatile bool initialized = false;
private static object syncObject = new object();
public static void Initialize() {
if (!initialized) {
lock (syncObject) {
if (!initialized) {
DoInitialization();
initialized = true;
}
}
}
}
答案 2 :(得分:1)
一些选择:
所有3种方法也可用于创建单身人士。