论坛上有人发过个贴子:
6、根据线程安全的相关知识,分析以下代码,当调用test方法时i>10时是否会引起死锁?并简要说明理由。(10分)
public void test(int i)
{
lock(this)
{
if (i>10)
{
i--;
test(i);
}
}
}
答:不会发生死锁,(但有一点int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个object,那么死锁会发生) 说int换成object有死锁,但是我如下代码: public void test(object i)
{
lock (this)
{
if ( Convert.ToInt32( i) > 10)
{
i = Convert.ToInt32(i)-1;
test(i);
}
}
}
没有发生死锁阿,请教下为什么发生死锁,怎样发生???
6、根据线程安全的相关知识,分析以下代码,当调用test方法时i>10时是否会引起死锁?并简要说明理由。(10分)
public void test(int i)
{
lock(this)
{
if (i>10)
{
i--;
test(i);
}
}
}
答:不会发生死锁,(但有一点int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个object,那么死锁会发生) 说int换成object有死锁,但是我如下代码: public void test(object i)
{
lock (this)
{
if ( Convert.ToInt32( i) > 10)
{
i = Convert.ToInt32(i)-1;
test(i);
}
}
}
没有发生死锁阿,请教下为什么发生死锁,怎样发生???
解决方案 »
- 使用keybd_event函数模拟鼠标点击,怎样设360或谷歌浏览器为相对坐标
- C#分别对sqlserver,oracle执行存储过程,返回参数中包含有记录集,如何显示记录集?
- 写一个播放器
- 单片机 怎么与 winform 进行tcp通信
- C#上下文不存在resources求解决?详细
- (急,在线等)关于PC与MC1000通信程序打包问题
- 如何实现一个自己的线程类
- dataGridView实现Ctrl+C复制功能
- 急:为何不能抛出异常?
- datagrid删除问题,大虾们帮帮忙
- 提问:错误提示--命名空间“System.Web”中不存在类型或命名空间名称“UI”(是缺少程序集引用吗?) 如何解决??
- C#中实现SQL通知
{
lock(this)
{
if (i>10)
{
--i;
test(i);
}
}
} 这样就会死锁了.
比如下面2个线程就死锁了namespace WindowsApplication18
{
public partial class Form1 : Form
{
int x = 0, y = 0;
Object X = new Object(), Y = new Object();
public Form1()
{
InitializeComponent();
} delegate void ShowText(String Text); void DoShowText(String Text)
{
this.Text = Text;
} void A()
{
ShowText PDoShowText = new ShowText(DoShowText);
while (true)
lock (X)
{
lock (Y)
{
y++;
this.Invoke(PDoShowText, new Object[] { "X:" + x.ToString() + " Y:" + y.ToString() });
}
}
} void B()
{
ShowText PDoShowText = new ShowText(DoShowText);
while (true)
lock (Y)
{
lock (X)
{
x++;
this.Invoke(PDoShowText, new Object[] { "X:" + x.ToString() + " Y:" + y.ToString() });
}
}
} private void Form1_Shown(object sender, EventArgs e)
{
// 每次X或Y(每次执行先后都不一样)加一后会立即发生死锁,X或Y不会继续增加
new System.Threading.Thread(new System.Threading.ThreadStart(A)).Start();
new System.Threading.Thread(new System.Threading.ThreadStart(B)).Start();
}
}
}
不会死锁,因为lock锁定的是不同线程间的操作,而递归调用属于同线程的调用。
1、此函数是递归调用,不会形成死循环的现象,因此最终都可以unlock(this)
2、lock一个对象是对线程范围内来考虑,同一线程内只有死循环,但不会死锁。死锁只有在不同线程中同时调用被lock的对象,只有此时在线程争夺对象时才会出现死锁现象。