string类型的字符串在创建和初始化时系统会检查内存中是否存在一样的值,如果一样就不会开辟新的空间,而是使用内存中相同字符串的地址,因此在lock(string),不同线程同时访问lock块时会发生阻塞,所以lock(string)是有一定的风险的,当然这也要看具体的应用场景
此例子使用三个字符串变量(2个不同名变量,一个匿名变量),其值完全一样,通过不同的线程去访问他们
public class LockString
{
public void GetNoLockStr(string hello)
{
Console.Write(Thread.CurrentThread.Name + ":");
Console.WriteLine(hello);
Thread.Sleep(TimeSpan.FromSeconds(3));
}
public void GetStr(string hello)
{
lock (hello)
{
Console.Write(Thread.CurrentThread.Name + ":");
Console.WriteLine(hello);
Thread.Sleep(TimeSpan.FromSeconds(3));
}
}
public void Test()
{
string Hello = "Hello";
string Hello1 = "Hello";
new Thread(() =>
{
GetStr(Hello);
}){ Name = "Thread Has Lock 0001" }.Start();
new Thread(() =>
{
GetStr(Hello1);
}){ Name = "Thread Has Lock 0002" }.Start();
new Thread(() =>
{
GetStr("Hello");
}){ Name = "Thread Has Lock 0003" }.Start();
new Thread(() =>
{
GetNoLockStr(Hello);
}){ Name = "Thread Without Lock 0004" }.Start();
new Thread(() =>
{
GetNoLockStr(Hello1);
}){ Name = "Thread Without Lock 0005" }.Start();
new Thread(() =>
{
GetNoLockStr("Hello");
}){ Name = "Thread Without Lock 0006" }.Start();
}
}