C#代码--加载顺序问题
答案:2 悬赏:80 手机版
解决时间 2021-11-08 07:04
- 提问者网友:不爱我么
- 2021-11-07 16:16
C#代码--加载顺序问题
最佳答案
- 五星知识达人网友:鱼芗
- 2021-11-07 17:05
add方法中,你是判断 key 不存在就添加, 你两个线程中提供的 key 不一样当然两个都会添加进去。
再说 lock方法里面少些一句,应该如下:
lock(obj)
{
en =list.xxxx;//就是把lock外面获取en的语句再重复执行一次
........if(en == null)............
}
再说 lock方法里面少些一句,应该如下:
lock(obj)
{
en =list.xxxx;//就是把lock外面获取en的语句再重复执行一次
........if(en == null)............
}
全部回答
- 1楼网友:不想翻身的咸鱼
- 2021-11-07 18:18
这样结果会不一样的。因为线程不受主线程的影响,什么时候执行到add这个过程都是不固定的,这就要看你电脑的执行速度了。
再说,class1是静态的。所以加了lock,lock并不是取先到先得的变量而后面的都抛弃,lock是将后面的数据暂时没有处理,先优先处理首先调用add这个过程的线程,其他线程暂停,而处理完毕才把停止的线程开启。追问
第2中情况,也就是en!=null才出现的情况。追问Class1有静态无参构造函数,这时候就new Class2一下,除此之外应该没有第二次实例化Class2的吧?如果只实例化过一次Class2,那list也只实例化过一次,那就是说第一次lock锁定的时候会把值(first)加进去,等unlock后第二个进来(假设第二个值也是first),但那时候list已经有值了,所以会return掉;也就是说不管加了多少个线程都是一样的结果应该是这样吧
再说,class1是静态的。所以加了lock,lock并不是取先到先得的变量而后面的都抛弃,lock是将后面的数据暂时没有处理,先优先处理首先调用add这个过程的线程,其他线程暂停,而处理完毕才把停止的线程开启。追问
要么结果就是一个都加不进去
---------线程2开始实例化class1
---------请求正在处理中。。。
---------请求正在处理中。。。
追答我按照图片里的代码说:第一次锁定obj显示的是“加载second”也就是说t2(Thread)优先执行了。此时lock暂停除了t2的线程——t1,然后执行lock里的,执行完毕后(unlock),把停掉的t1(Thread)继续,也就又来到了lock,此时暂停了t2线程,输出了“加载first”。所以第二次是可以加进去的。你改成方法也是一样的,这跟有没有返回值没有关系的。lock是对于线程来说的。第2中情况,也就是en!=null才出现的情况。追问Class1有静态无参构造函数,这时候就new Class2一下,除此之外应该没有第二次实例化Class2的吧?如果只实例化过一次Class2,那list也只实例化过一次,那就是说第一次lock锁定的时候会把值(first)加进去,等unlock后第二个进来(假设第二个值也是first),但那时候list已经有值了,所以会return掉;也就是说不管加了多少个线程都是一样的结果应该是这样吧
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯