我将对C锁的理解发布如下,请帮助我验证我是否正确。
public class TestLock
{
private object threadLock = new object();
...
public void PrintOne()
{
lock (threadLock)
{
// SectionOne
}
}
public void PrintTwo()
{
lock (threadLock)
{
// SectionTwo
}
}
...
}
case i>thread1和thread2同时尝试调用printone。
因为printone在任何时候都由实例锁保护
一个线程可以独占地进入SectionOne。
这是对的吗?
案例II>线程1和线程2同时尝试调用printone和print2
分别(即thread1调用printone,thread2调用print2)
由于两个打印方法在任何时候都由同一个实例锁保护,
只有一个线程可以独占地访问section1或section2,但不能同时访问两者。
这是对的吗?
最佳答案
只有当所有线程使用类的同一实例时,1和2才为真。如果它们使用不同的实例,那么这两种情况都是错误的
样品
public class TestLock
{
private object threadLock = new object();
public void PrintOne()
{
lock (threadLock)
{
Console.WriteLine("One");
var f = File.OpenWrite(@"C:\temp\file.txt"); //same static resource
f.Close();
}
}
public void PrintTwo()
{
lock (threadLock)
{
Console.WriteLine("Two");
var f = File.OpenWrite(@"C:\temp\file.txt"); //same static resource
f.Close();
}
}
}
和测试代码
static void Main(string[] args)
{
int caseNumber = 100;
var threads = new Thread[caseNumber];
for (int i = 0; i < caseNumber; i++)
{
var t = new Thread(() =>
{
//create new instance
var testLock = new TestLock();
//for this instance we safe
testLock.PrintOne();
testLock.PrintTwo();
});
t.Start();
//once created more than one thread, we are unsafe
}
}
可能的解决方案之一是将静态关键字添加到锁定对象声明和使用它的方法中。
private static object threadLock = new object();
更新
Konrad.Kruczynski的观点很好
…“线程安全”也假定为
上下文。例如,我可以
你的文件打开代码
使用静态锁生成异常-
只是拿了另一份申请
领域。因此建议
应该使用系统范围的互斥类或
那样的东西。因此静态情况
只是推断为实例一。