我试图限制对单例对象的访问,所以只有一个线程 及时使用它,此外,我想防止同一个线程访问两次 到受限代码。
我尝试了 Lock 方法,我发现它不会锁定锁定她的线程,但只会锁定其他线程..
如下:
public sealed class Singleton
{
private static readonly Singleton instance = new Singleton();
static Singleton()
{
}
private Singleton()
{
}
public static Singleton Instance
{
get
{
return instance;
}
}
}
public class SomeWorker
{
private readonly Timer _doWorkTimer = new Timer(20);
public SomeWorker()
{
InitiateTimer();
}
private void InitiateTimer()
{
_doWorkTimer .Elapsed += DoWorkElapse;
_doWorkTimer .Enabled = true;
}
private void DoWorkElapse(object source, ElapsedEventArgs e)
{
DoSomeWork();
}
private void DoSomeWork()
{
// I know that lock on string is wrong!
// Its just for the example only I
// Its just to make sure all the program is use the same lock..
lock ("ConnectionLock")
{
Console.WriteLine("Lock");
var inst = Singletone.Instance;
// Do Some Work on "inst" ...
Console.WriteLine("Unlock");
}
}
}
例如控制台中的结果是:
. . .
锁定
解锁
锁定
锁定
解锁
. . .
可以看到,2个Lock评论一个接一个显示
所以这意味着“DoSomeWork()”被计时器线程访问了两次。
有人知道如何让这个锁起作用吗?
可能还有其他同步方法?
谢谢。
请您参考如下方法:
您没有正确进行锁定(最重要的是,您锁定了一个字符串,这是一个很大的禁忌)。为了节省时间,请阅读this Jon Skeet 的文章并实现其中一种模式来避免头痛。
