fgetpos
为什么我应该在同步上面的代码时将对象传递给lock关键字。如果我也传递它将在哪里使用。我知道它用于获取该对象的锁定。但我想知道我们如何获得锁定深度对象。线程如何释放我们在lock关键字中传递的对象的锁。
答案 0 :(得分:4)
lock
语句是使用Monitor
方法进行线程同步的语法糖。 Monitor
表示某些资源上的独占锁,而在.NET中,资源是对象。
为什么需要提供Monitor
的对象引用?好吧,因为你想在多线程环境中同步对整个对象的访问。
线程如何释放我们传入锁定对象的锁定 关键字?
考虑lock
如下:
Monitor.Enter(obj);
try
{
// This would be the code inside the "lock" block
}
finally
{
if(Monitor.IsEntered(obj))
Monitor.Exit(obj); // <-- This is how a Monitor releases the lock
}
答案 1 :(得分:0)
您不需要将锁定限制为Object对象,例如,您可以锁定Dictionary对象,以防止其他线程从集合中添加或删除。
或
如果您不想使用lock关键字,可以使用[MethodImpl(MethodImplOptions.Synchronized)]
例如
[MethodImpl(MethodImplOptions.Synchronized)]
static void mySynchronisedTask()
{
//do things that i want to be synchronised
Console.WriteLine("before sync task");
Thread.Sleep(5000);
Console.WriteLine("after sync task");
}