请教c#中lock的问题

请教大家一个问题
在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不同就不锁了,怎么实现?


繁星点点滴滴
浏览 752回答 2
2回答

慕田峪4524236

lock(xxx) -> Monitor.Enter(xxx) :使用 Enter 获取作为参数传递的对象上的 Monitor。如果其他线程已对该对象执行了 Enter,但尚未执行对应的 Exit,则当前线程将阻止,直到对方线程释放该对象。同一线程在不阻止的情况下多次调用 Enter 是合法的;但在该对象上等待的其他线程取消阻止之前必须调用相同数目的 Exit。 是希望不同实例之间的话lock(this) 应该就可以.如果只是username相同,  猜想一下lock(username)  囧了 因为string这东西比较折腾的缘故, 有时候一样的string"值",并不一定就是同一个实例.  虽然并不会引起异常的样子,但是 可能并不会真的lock.  所以 真的要考虑username相同即lock的话 可能得用一些附加的手段(从内容相同 而实例可能不同的string 得到一个一定相同的对象) 如果希望的是当前类型都锁   lock(静态变量) 这样的自然是这类型的包围这个lock的方法执行到这的时候都得好好的去排队了
打开App,查看更多内容
随时随地看视频慕课网APP