[!!!help!!!] 线程同步,互斥锁lock的问题...lock为何不起作用???愚翁,速马等老大请进... [!!!help!!!]

lj915 lj915 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
写了一个简单的测试程序,发现有些很迷惑的地方...

先贴出程序的主要部分:

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就可以获取它的锁并对其进行操作呢?
...全文
评论 34
收藏 已收藏
分享
返回顶部
lj915
C# 111,128 成员 642,537 内容