在课堂上,我有两种方法:
这个类可以被多个线程访问。 我怎么能意识到,如果" thread1"打电话"方法1"," thread2"正在等待"方法2"或者在" Method1"。如果" thread2"这个逻辑也应该有用。正在调用"方法2",即" thread1"等待"方法1"或"方法2"
我的想法是:
private object _lock = new object();
void Method1() {
lock(_lock){
//TODO: do something
}
}
void Method2() {
lock(_lock){
//TODO: do something
}
}
这会有用吗?
答案 0 :(得分:1)
在您的评论澄清后,您的代码将有效。
使用给定的代码,您将:
Method1
或Method2
Method1
内,其他线程会在尝试拨打Method1
或Method2
时等待。如果Method1
调用Method2
,反之亦然,这也可以,因为同一个线程可以多次锁定同一个对象。
换句话说,这是不死锁:
lock (x)
lock (x)
....
所以你的代码应该可以正常工作。
答案 1 :(得分:0)
你不能在同一个对象上做,你可以使用Monitor。监控允许重新入侵
答案 2 :(得分:0)
您可以使用AutoResetEvent的WaitOne()函数,只允许一个函数一次访问资源,当它完成时称为Set()。
此处示例:Synchronizing two threads with AutoResetEvent
MSDN参考:https://msdn.microsoft.com/en-us/library/system.threading.autoresetevent(v=vs.110).aspx
答案 3 :(得分:0)
您的方法应该是同步的。请参阅C# version of java's synchronized keyword?以了解如何在c#中执行此操作。
答案 4 :(得分:0)
这会奏效。由于您锁定了同一个对象,因此在给定时间只会执行一个lock { }
块。
如果“thread1”调用“Method1”,“thread2”在“Method2”或“Method1”中等待,我怎么才能意识到?如果“thread2”调用“Method2”,“thread1”在“Method1”或“Method2”中等待
,这个逻辑也应该有效。
逻辑可行。但不确定你在这里问的是什么。