首页 新闻 会员 周边

线程同步问题:此段代码未加锁,为什么不抛出异常?

0
悬赏园豆:100 [待解决问题]

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;
    }
}

qinkyo098的主页 qinkyo098 | 初学一级 | 园豆:102
提问于:2012-03-21 21:47
< >
分享
所有回答(4)
0

首先int是值类型,且默认值为0,a.val一直都大于0所以不会抛出异常。

在线程部分,可以打印出来观察下,会有收获的

az235 | 园豆:8483 (大侠五级) | 2012-03-21 23:10

在c#中线程的创建是需要时间,start时不需要创建,而你cpu可能够快,会看到类似于顺序执行的效果

支持(0) 反对(0) az235 | 园豆:8483 (大侠五级) | 2012-03-21 23:13
0

因为你用的是int类型。int是值类型,所以不会报错。我这几天还尝试了一下,如果你把一个int类型的值(显示转换成object)作为lock的关键字,那么这个lock是无效的。你可以试一试传参的时候加上【ref】

                                                                                                个人建议,不一定对,如果有正确结论希望也能告诉我一声,3Q

我是小虫 | 园豆:200 (初学一级) | 2012-03-22 08:50
0

我 給你說。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)

無限遐想 | 园豆:3740 (老鸟四级) | 2012-03-22 09:15
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!");
}

这种情况啊
 




havid | 园豆:70 (初学一级) | 2012-03-26 15:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册