以下代码是否是线程安全的?我认为这是因为字符串是不可变的。 (代码为了演示目的而一起抛出)
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后感到很好奇(锁定和原子性部分的前几行)。
答案 0 :(得分:2)
是的,它是线程安全的。
即使删除锁也会使其线程安全: - )
您只使用局部变量和静态BCL方法(它们始终是线程安全的)。
答案 1 :(得分:2)
字符串是不可变的,所以它们在构造之后永远不会改变。 并且因为你在本地没有被ref传递,所以引用也不会改变,所以它是安全的
答案 2 :(得分:1)
它是线程安全的,但File.Delete
抛出的任何异常都会在堆栈展开时替换真正的异常。