[!!!help!!!] 线程同步,互斥锁lock的问题...lock为何不起作用???愚翁,速马等老大请进... [!!!help!!!]
lj915 2006-08-09 01:08:13 写了一个简单的测试程序,发现有些很迷惑的地方...
先贴出程序的主要部分:
private System.Windows.Forms.Button button1;
private Object syncObj;
private Thread t1;
private Thread t2;
private volatile bool runT1;
private volatile bool runT2;
private void Form1_Load(object sender, System.EventArgs e)
{
syncObj = new object();
runT1 = true;
runT2 = true;
}
private void testObj()
{
syncObj = "t1";
}
private void testT1()
{
Console.WriteLine("t1 started");
lock(syncObj)
{
Console.WriteLine("t1 locked syncObj");
while(runT1)
{
//syncObj = "t1";
Thread.Sleep(1000);
}
}
}
private void testT2()
{
Console.WriteLine("t2 started");
Thread.Sleep(1000);
while(runT2)
{
lock(syncObj)
{
Console.WriteLine("t2 locked syncObj");
Thread.Sleep(1000);
}
}
}
private void button1_Click(object sender, System.EventArgs e)
{
runT1 = true;
runT2 = true;
t1 = new Thread(new ThreadStart(testT1));
t2 = new Thread(new ThreadStart(testT2));
t1.Name = "t1";
t2.Name = "t2";
t1.IsBackground = true;
t2.IsBackground = true;
t1.Start();
t2.Start();
button1.Enabled = false;
}
在线程t1一开始就已经锁住了syncObj,要知道t1退出才会释放syncObj的锁,这个时候t2才能够获得syncObj的锁,
上面的代码实现了上面所说的逻辑,输出:
t1 started
t1 locked syncObj
t2 started
但是如果将testT1()中被屏蔽的语句“syncObj = "t1";” 取消屏蔽,
程序就会出现t1在lock(syncObj)的期间,只要一修改sycnObj的值,
t2马上就可以获得syncObj的锁...
输出:
t1 is start
t1 locked syncObj
t2 is start
t2 locked syncObj
t2 locked syncObj
t2 locked syncObj
t2 locked syncObj
t2 locked syncObj
...
...
<程序退出>
在t1的生存期内,一直都没有释放过syncObj的锁,
但是只要一修改它的值,t2就可以获取它的锁并对其进行操作呢?