在锁之外声明并在锁中使用的字符串是否可以被另一个线程更改?

时间:2011-09-01 09:13:00

标签: c# multithreading

以下代码是否是线程安全的?我认为这是因为字符串是不可变的。 (代码为了演示目的而一起抛出)

static readonly object _lockObject = new object();

void SomeMethod(string filePath, string fileName)
{
    // Any reason for this to be moved inside the lock?
    string s = Path.Combine(filePath, fileName);

    lock (_lockObject)
    {
       try
       {
          // Other stuff to create the file here. 
       }
       finally
       {
          File.Delete(s);
       }
    }
}

我在阅读this后感到很好奇(锁定和原子性部分的前几行)。

3 个答案:

答案 0 :(得分:2)

是的,它是线程安全的。

即使删除锁也会使其线程安全: - )

您只使用局部变量和静态BCL方法(它们始终是线程安全的)。

答案 1 :(得分:2)

字符串是不可变的,所以它们在构造之后永远不会改变。 并且因为你在本地没有被ref传递,所以引用也不会改变,所以它是安全的

答案 2 :(得分:1)

它是线程安全的,但File.Delete抛出的任何异常都会在堆栈展开时替换真正的异常。