请教大家一个问题在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的方法执行到这的时候都得好好的去排队了
- 2 回答
- 0 关注
- 751 浏览
添加回答
举报
0/150
提交
取消