C# 值类型传参与引用类型传参 在多线程调用时的区别
2013-05-15 17:39
260 查看
看一道雅虎 的面试题
这道题问的是会不会产生死锁?想考的是这么递归的去锁,会不会死锁,但其实这个问题可以看出2个问题来。
这里多线程调用此方法时不会产生死锁,原因是
还有一个问题是 int i。 int是值类型,传参其实是值的一个副本。但是如果这里的参数换成引用类型,就会有同步的问题
比如:
以上代码会产生同步竞争。解决办法:
void test(int i) { lock(this) { if(i > 10) { i--; test(i); } } }
这道题问的是会不会产生死锁?想考的是这么递归的去锁,会不会死锁,但其实这个问题可以看出2个问题来。
这里多线程调用此方法时不会产生死锁,原因是
Lock语句对 “同一个线程多次锁同一个对象不予理会"
还有一个问题是 int i。 int是值类型,传参其实是值的一个副本。但是如果这里的参数换成引用类型,就会有同步的问题
void test(xxobject o) //这里o就是竞争资源,需要在其内部讲共用资源锁起来 { lock(this) { } }
比如:
public class StateObject { private int state = 5; public void ChangeState(int loop) { if (state == 5) { state++; Trace.Assert(state == 6, "race condition occurred after " + loop + " loops"); } state = 5; } } public class SampleTask { public void RaceCondition(object oj) { StateObject obj = (StateObject)oj; int i = 0; while (true) { Console.WriteLine(i); obj.ChangeState(i++); if (i > 200000) { break; } } } } //调用代码 StateObject obj = new StateObject(); for (int i = 0; i < 200; i++) { new Task(new SampleTask().RaceCondition, obj).Start(); }
以上代码会产生同步竞争。解决办法:
lock{ if (state == 5) { state++; Trace.Assert(state == 6, "race condition occurred after " + loop + " loops"); } state = 5; }
相关文章推荐
- C# 值类型传参与引用类型传参 在多线程调用时的区别
- c# 值类型与引用类型的传参(形参与实参)
- C#调用Excel报 error CS1969: 找不到编译动态表达式所需的一个或多个类型。是否缺少引用?
- C# 方法传参时,传入值类型、引用类型、string引用类型、ref修饰参数时分析
- 深入C#内存管理来分析值类型&引用类型,装箱&拆箱,堆栈几个概念组合之间的区别
- 【转】c#引用类型与值类型的区别大盘点
- C#引用类型和值类型的区别
- C#中值类型和引用类型区别
- 深入C#内存管理来分析值类型&引用类型,装箱&拆箱,堆栈几个概念组合之间的区别
- 实际举例C#引用类型和值类型的区别
- C#引用类型和值类型的区别(转)
- [C#] 值类型与引用类型的区别?
- [C#] 值类型与引用类型的区别?
- C# 中 值类型和引用类型的区别
- c#方法中调用参数的值传递方式和引用传递方式以及ref与out的区别深入解析
- C# 中==和Equals方法在引用类型中的区别
- 【转】C#详解值类型和引用类型区别
- C#调用Excel报 error CS1969: 找不到编译动态表达式所需的一个或多个类型。是否缺少引用?
- 多重影分身——C#中多线程的使用三(调用方法和传参)
- C# 值类型和引用类型的区别