using System;
using System.Threading;
class Account
{
private Object thisLock = new Object();
aa a = new aa(100);
Random r = new Random();
int aa(int amount)
{
#region 此段代码没加锁,为什么不抛出异常?
if (a.val < 0)
{
throw new Exception("aa error!");
}
if (a.val > amount)
{
a.val -= amount;
return a.val;
}
else
{
return 0;
}
#endregion
}
public void DoTransactions()
{
for (int i = 0; i < 100; i++)
{
aa(r.Next(1, 100));
}
}
}
class Test
{
static void Main()
{
Thread[] threads = new Thread[100];
Account acc = new Account();
for (int i = 0; i < 100; i++)
{
Thread t = new Thread(new ThreadStart(acc.DoTransactions));
threads[i] = t;
}
for (int i = 0; i < 100; i++)
{
threads[i].Start();
}
}
}
class aa
{
public int val { get; set; }
public aa(int val)
{
this.val = val;
}
}
首先int是值类型,且默认值为0,a.val一直都大于0所以不会抛出异常。
在线程部分,可以打印出来观察下,会有收获的
在c#中线程的创建是需要时间,start时不需要创建,而你cpu可能够快,会看到类似于顺序执行的效果
因为你用的是int类型。int是值类型,所以不会报错。我这几天还尝试了一下,如果你把一个int类型的值(显示转换成object)作为lock的关键字,那么这个lock是无效的。你可以试一试传参的时候加上【ref】
个人建议,不一定对,如果有正确结论希望也能告诉我一声,3Q
我 給你說。Random r = new Random();
r.Next(1, 100),可能 一直 是同一個數。
再說。你的代碼:
if (a.val < 0)
{
throw new Exception("aa error!");
}
if (a.val > amount)
{
a.val -= amount;
return a.val;
}
else
{
return 0;
}
如果:a.val <= amount的情況 呢。沒有處理。
因此 不會,出現 if (a.val < 0)
楼主应该输出一下 a.val 的值看看
if (a.val > amount)
{
a.val -= amount;
return a.val;
}
else
{
return 0;
}
你这可能一直都是0 所以根本不会出现
if (a.val < 0)
{
throw new Exception("aa error!");
}
这种情况啊