因为我觉得dic和cancel变量是方法内部的,每个执行这个方法所产生的对象是唯一的,我觉得不用加lock去保证这两个变量的线程安全问题,有没有人赞同的?
赞同, 单就task.run的代码来说没啥问题.
有问题的地方在于, 如果这整个方法被并发调用, 那最终的结果就有可能不符合预期.
是的,但是我这里这个方法不会被并发调用
@灬丶:
那就问题不大了.
代码可以简化一点:
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)
@czd890: 你指的并发调用是指客户端大量调用这个方法吗
@灬丶: 是的呀
如果没猜错这个是Cache的,那就会有安全问题了。
为啥子啊
要使用 线程安全 的集合 ConcurrentDictionary
我这个Dictionary不是static修饰的啊,又不是全局共用的,每个主线程只会有一个唯一对象
可以的,大胆的往前冲。都是函数级的变量,每次调用都不会是同例。所以不存在安全问题
哈哈哈哈哈哈
先说结论,仅以代码部分 需要 考虑 并发带来的线程安全问题。
楼主所说的前提 是 该方法的所属类的生命周期为 Transient。这个确实可以做到。
但是还有另外一个场景,即:如果 引用该类的的其他类的生命周期是 Singleton 或者 Scope 呢?那么这个类在调用过程中 就存在并发问题了。
再补充下,
针对第二个场景问题,即需要保证该类的生命周期必须为 Transient。那么则还需要引入一个Factory用来创建此类,保证每次获取的实例都是 new 出来的。这样的话,才可以考虑 忽略 线程安全问题了
学到了