首页 新闻 赞助 找找看

这个代码段会出现线程安全问题吗

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

因为我觉得dic和cancel变量是方法内部的,每个执行这个方法所产生的对象是唯一的,我觉得不用加lock去保证这两个变量的线程安全问题,有没有人赞同的?

灬丶的主页 灬丶 | 初学一级 | 园豆:4
提问于:2021-03-15 10:49
< >
分享
所有回答(5)
0

赞同, 单就task.run的代码来说没啥问题.

有问题的地方在于, 如果这整个方法被并发调用, 那最终的结果就有可能不符合预期.

czd890 | 园豆:14292 (专家六级) | 2021-03-15 11:45

是的,但是我这里这个方法不会被并发调用

支持(0) 反对(0) 灬丶 | 园豆:4 (初学一级) | 2021-03-15 12:04

@灬丶:
那就问题不大了.

代码可以简化一点:

dic=dic??new();
(!dic.trygetvalue(id,out var hs)||hs==null)
    dic[id]=hs=new();
var cancel=!hs.add(acount);
if(cancel){
    hs.remove(account)
支持(0) 反对(0) czd890 | 园豆:14292 (专家六级) | 2021-03-15 12:23

@czd890: 你指的并发调用是指客户端大量调用这个方法吗

支持(0) 反对(0) 灬丶 | 园豆:4 (初学一级) | 2021-03-15 13:58

@灬丶: 是的呀

支持(0) 反对(0) czd890 | 园豆:14292 (专家六级) | 2021-03-15 14:12
0

如果没猜错这个是Cache的,那就会有安全问题了。

56180825 | 园豆:1756 (小虾三级) | 2021-03-15 20:33

为啥子啊

支持(0) 反对(0) 灬丶 | 园豆:4 (初学一级) | 2021-03-16 08:55
0

要使用 线程安全 的集合 ConcurrentDictionary

geass.. | 园豆:1821 (小虾三级) | 2021-03-17 11:08

我这个Dictionary不是static修饰的啊,又不是全局共用的,每个主线程只会有一个唯一对象

支持(0) 反对(0) 灬丶 | 园豆:4 (初学一级) | 2021-03-17 12:06
0

可以的,大胆的往前冲。都是函数级的变量,每次调用都不会是同例。所以不存在安全问题

pencile | 园豆:845 (小虾三级) | 2021-03-17 14:04

哈哈哈哈哈哈

支持(0) 反对(0) 灬丶 | 园豆:4 (初学一级) | 2021-03-17 15:03
0

先说结论,仅以代码部分 需要 考虑 并发带来的线程安全问题。
楼主所说的前提 是 该方法的所属类的生命周期为 Transient。这个确实可以做到。
但是还有另外一个场景,即:如果 引用该类的的其他类的生命周期是 Singleton 或者 Scope 呢?那么这个类在调用过程中 就存在并发问题了。
再补充下,
针对第二个场景问题,即需要保证该类的生命周期必须为 Transient。那么则还需要引入一个Factory用来创建此类,保证每次获取的实例都是 new 出来的。这样的话,才可以考虑 忽略 线程安全问题了

gt1987 | 园豆:1150 (小虾三级) | 2021-03-29 11:09

学到了

支持(0) 反对(0) 灬丶 | 园豆:4 (初学一级) | 2021-03-29 11:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册