net 关于Lock的问题,求大神解答一下。

黑子大哥 2019-01-30 01:23:39
考虑并发问题 很多都想到了Lock

但是由于小弟学艺不精,再次卡壳了,还请大神赐教。

事情是这样的,我想实现一个Lock,是基于参数级别的锁,

比如有一个Fun,传入参数为一个Obj或者字符串

假设,这里假设一下
lock(obj)

要求当传入参数为123456的时候,lock锁定住所有传入参数为123456的线程,
如果传入的参数为456789,那么lock锁住所有456789,
意思就是要这个lock是锁定参数级别,并非全部。


因为现在有一个需求,用户请求网站一个地址,很多,绝对有并发,要求速度不要慢,不要死锁,锁只正对参数级别进行锁,参数一样的我就直接返回了
...全文
615 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
类似地有许多什么“依赖注入、监控、锁住、Dispose”等等容易掺入混乱地标题党的所谓技术词儿。你知道内部协议,明确知道每一个使用协议的东西到底是干什么的、内部具体如何干的,你才知道怎么使用它来协同不同的原本已经埋藏好的事件代码。如果原来没有设计好相关事件,那么你就不得不重构整个代码。 编程中最忌讳是标题党地去胡乱使用这些词儿,以为什么事儿都能干。
  • 打赏
  • 举报
回复
这就好像说“一个密码可以开几个金库”,于是你就说“我想实现一个天外飞仙的梦想,基于参数密码,能开全天下所有金库”,这其实就是本末倒置的。你知道内部的东西才知道有没有可行性,而不是标题党。
  • 打赏
  • 举报
回复
“锁住 xxxx 线程”是啥概念?这其实是本末倒置的概念,造成了危害。 lock 语句块是以某个对象为信号量,例如

   string x = ......;
   var a = GetMyObject(x);
   lock(a)
   {
        .................
   }
那么这里你可以说,假设不同线程所执行的代码从同一个字符串值为 key 的几何中可以取得相同的对象,那么这里就可以“同步控制语句块”。 代码在不同线程中运行时的同步,其实是基于它们有这种“信号量对象”的协议。并不是什么“锁定住所有传入参数为123456的线程”。 之所以能够同步,是基于内因,而不是基于外因。外部提供的是目的,不是标题党,仅有目地而内部不是灵活地重构代码,其实什么都干不成事儿。
  • 打赏
  • 举报
回复
引用 5 楼 黑子大哥 的回复:
[quote=引用 4 楼 胖叔叔写代码 的回复:] 和人推荐你再理一下业务逻辑,我处理你这个业务会这样: 增加一个列表对象作为缓存列表。 增加一个队列,用于读取缓存。 增加一个方法用于增加读取缓存的事件到队列。 增加一个线程用于过期不需要的缓存。 增加一个线程用于执行读取缓存队列。 这样你只需要在所有操作缓存列表的地方锁住缓存列表即可。
这种方案也不可行,虽然队列保证了处理依次性,也就是说在请求图片的过程中就成了单线程的感觉了,页面图片不多不少十来二十张,势必造成图片加载速度特别慢,因为图片请求是并行,请求的时候进入队列,那么势必要等待处理完毕,如果是第一次加载,要下载、缓存、这个速度可想而知了 其实仔细思索了一下,这个需求可能本身有点问题,没看到有什么人这么做过 [/quote] 单线程你可以并行处理啊,你想一次处理三个还是五个谁管你啊,只是处理队列的线程只有一个,至于执行方法的线程是你自己操作的啊,你只要保证列表里面不要重复处理就行了啊………………你是怎么理解成单线程处理队列就是队列中的东西也必须单线程的?
黑子大哥 2019-01-30
  • 打赏
  • 举报
回复
引用 4 楼 胖叔叔写代码 的回复:
和人推荐你再理一下业务逻辑,我处理你这个业务会这样:

增加一个列表对象作为缓存列表。

增加一个队列,用于读取缓存。
增加一个方法用于增加读取缓存的事件到队列。
增加一个线程用于过期不需要的缓存。
增加一个线程用于执行读取缓存队列。

这样你只需要在所有操作缓存列表的地方锁住缓存列表即可。


这种方案也不可行,虽然队列保证了处理依次性,也就是说在请求图片的过程中就成了单线程的感觉了,页面图片不多不少十来二十张,势必造成图片加载速度特别慢,因为图片请求是并行,请求的时候进入队列,那么势必要等待处理完毕,如果是第一次加载,要下载、缓存、这个速度可想而知了

其实仔细思索了一下,这个需求可能本身有点问题,没看到有什么人这么做过
  • 打赏
  • 举报
回复
和人推荐你再理一下业务逻辑,我处理你这个业务会这样: 增加一个列表对象作为缓存列表。 增加一个队列,用于读取缓存。 增加一个方法用于增加读取缓存的事件到队列。 增加一个线程用于过期不需要的缓存。 增加一个线程用于执行读取缓存队列。 这样你只需要在所有操作缓存列表的地方锁住缓存列表即可。
黑子大哥 2019-01-30
  • 打赏
  • 举报
回复
引用 2 楼 丰云 的回复:
只有你自己开启了多线程时,在线程内部出现外部资源争夺时,才需要用到锁,其他一律不用!
如果要用,肯定是自己某些方面理解错了,导致逻辑写错了造成的!!

是这样子的,有一些网络资源的图片,这个图片想要使用被访问的时候才做本地下载,没有被访问到就不被缓存,所以当一个页面有好几张图片的时候就会发起多次请求,由于网络资源稳定性不确定,为此要做一次缓存,当然也可以刚开始吧所有的图片都缓存下来,但是我不想这样子

并且网络图片有的是http的有的是https的,由于协议不通,也会导致http的被拒绝加载,所以采用这种方案,cache/img?url=http//。。。。。 这种方式做实时缓存,所以我想基于网络图片的路径作为参数来做缓存,但是锁我搞不定了
丰云 2019-01-30
  • 打赏
  • 举报
回复
只有你自己开启了多线程时,在线程内部出现外部资源争夺时,才需要用到锁,其他一律不用! 如果要用,肯定是自己某些方面理解错了,导致逻辑写错了造成的!!
丰云 2019-01-30
  • 打赏
  • 举报
回复
没听说请求一个网页需要用到锁的。。。

62,047

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧