为了账号安全,请及时绑定邮箱和手机立即绑定

请教c#中lock的问题

请教c#中lock的问题

繁星点点滴滴 2018-11-07 04:01:29
请教大家一个问题在c#中的多线程问题,有一个类public class A{private string username;public A(string _username){username=_username;}public void dothing(){    lock(username)     {        //一些操作代码     }}}其他很多程序中并发创建这个类实例A a=new A("name");a.dothing();我想如果多个实例中的username相同的话就锁住方法dothing()中的操作代码让只能有一个实例执行,username不同就不锁了,怎么实现?
查看完整描述

2 回答

?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

lock(xxx) -> Monitor.Enter(xxx) :使用 Enter 获取作为参数传递的对象上的 Monitor。如果其他线程已对该对象执行了 Enter,但尚未执行对应的 Exit,则当前线程将阻止,直到对方线程释放该对象。同一线程在不阻止的情况下多次调用 Enter 是合法的;但在该对象上等待的其他线程取消阻止之前必须调用相同数目的 Exit。

 

是希望不同实例之间的话

lock(this) 应该就可以.

如果只是username相同,  猜想一下

lock(username)  囧了 因为string这东西比较折腾的缘故, 有时候一样的string"值",并不一定就是同一个实例.  虽然并不会引起异常的样子,但是 可能并不会真的lock.  
所以 真的要考虑username相同即lock的话 可能得用一些附加的手段(从内容相同 而实例可能不同的string 得到一个一定相同的对象)

 

如果希望的是当前类型都锁   lock(静态变量) 这样的自然是这类型的包围这个lock的方法执行到这的时候都得好好的去排队了



查看完整回答
反对 回复 2018-11-12
  • 2 回答
  • 0 关注
  • 751 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信