代码如下,Lock为什么锁不到list变量呀!using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
ReadMessage rm = new ReadMessage();
rm.startW();
Thread.Sleep(100);
GetMessage gm = new GetMessage();
gm.startC(); Console.ReadKey();
}
}
public class ReadMessage
{
GetMessage gm = new GetMessage();
public void startW()
{
System.Threading.Thread th = new System.Threading.Thread(new ThreadStart(startWW));
th.Start();
}
private void startWW()
{
List<string> list = new List<string> { };
while (true)
{
list = gm.retruelist();
if (list != null)
{
foreach (string str in list)
Console.WriteLine(str + " Read");
}
} }
}
public class GetMessage
{
public void startC()
{
Thread th = new Thread(new ThreadStart(startCC));
th.Start();
}
private void startCC()
{
int i = 0;
while (true)
{
stratsomething(i.ToString());
Console.WriteLine(i+" Write");
if (i++ >= 100)
break;
} }
public void stratsomething(string _str)
{
ListMessage.Set(_str);
}
public List<string> retruelist()
{
return (List<string>)ListMessage.Get();
} } public static class ListMessage
{
public static List<string> listmessage = new List<string> { }; private static object _Root = new object(); public static object Get()
{
object result = null;
lock (_Root)
{
result = listmessage;
Thread.Sleep(300);
listmessage.Clear();
}
return result;
} public static void Set(string value)
{
lock (_Root)
{
listmessage.Add(value);
}
}
}
}
using System.Collections.Generic;
using System.Text;
using System.Threading;namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
ReadMessage rm = new ReadMessage();
rm.startW();
Thread.Sleep(100);
GetMessage gm = new GetMessage();
gm.startC(); Console.ReadKey();
}
}
public class ReadMessage
{
GetMessage gm = new GetMessage();
public void startW()
{
System.Threading.Thread th = new System.Threading.Thread(new ThreadStart(startWW));
th.Start();
}
private void startWW()
{
List<string> list = new List<string> { };
while (true)
{
list = gm.retruelist();
if (list != null)
{
foreach (string str in list)
Console.WriteLine(str + " Read");
}
} }
}
public class GetMessage
{
public void startC()
{
Thread th = new Thread(new ThreadStart(startCC));
th.Start();
}
private void startCC()
{
int i = 0;
while (true)
{
stratsomething(i.ToString());
Console.WriteLine(i+" Write");
if (i++ >= 100)
break;
} }
public void stratsomething(string _str)
{
ListMessage.Set(_str);
}
public List<string> retruelist()
{
return (List<string>)ListMessage.Get();
} } public static class ListMessage
{
public static List<string> listmessage = new List<string> { }; private static object _Root = new object(); public static object Get()
{
object result = null;
lock (_Root)
{
result = listmessage;
Thread.Sleep(300);
listmessage.Clear();
}
return result;
} public static void Set(string value)
{
lock (_Root)
{
listmessage.Add(value);
}
}
}
}
这个list写的时候不允许读,
当这个list被读出后
在输出的完清空list的时间段,不允许写
Console.ReadKey();
这句注释掉才能看到结果
{
foreach (string str in list)
Console.WriteLine(str + " Read");
}在这里加lock
当这个list被读出后
在输出的完清空list的时间段,不允许写
{
static void Main(string[] args)
{
ReadMessage rm = new ReadMessage();
rm.startW();
Thread.Sleep(100);
GetMessage gm = new GetMessage();
gm.startC(); Console.ReadKey();
}
}
public class ReadMessage
{
GetMessage gm = new GetMessage();
public void startW()
{
System.Threading.Thread th = new System.Threading.Thread(new ThreadStart(startWW));
th.Start();
}
private void startWW()
{
List<string> list = new List<string> { };
while (true)
{
bool entered = Monitor.TryEnter(typeof(GetMessage), 1000);
try
{
list = gm.retruelist();
if (list.Count != 0)
{
foreach (string str in list)
Console.WriteLine(str + " Read");
break;
} Thread.Sleep(1000);
}
finally
{
if (entered)
Monitor.Exit(typeof(GetMessage));
}
} }
}
public class GetMessage
{
public void startC()
{
Thread th = new Thread(new ThreadStart(startCC));
th.Start();
}
private void startCC()
{
int i = 0;
while (true)
{
bool entered = Monitor.TryEnter(typeof(GetMessage), 1000);
try
{
stratsomething(i.ToString());
Console.WriteLine(i + " Write");
if (i++ >= 100)
break;
}
finally
{
if (entered)
Monitor.Exit(typeof(GetMessage));
}
} }
public void stratsomething(string _str)
{
ListMessage.Set(_str);
}
public List<string> retruelist()
{
return (List<string>)ListMessage.Get();
} } public static class ListMessage
{
public static List<string> listmessage = new List<string> { }; private static object _Root = new object(); public static object Get()
{
lock (_Root)
{
Thread.Sleep(300);
return listmessage;
}
} public static void Set(string value)
{
lock (_Root)
{
listmessage.Add(value);
}
}
}