C# 为什么在同步时要将对象传递给lock关键字

C# 为什么在同步时要将对象传递给lock关键字,c#,multithreading,monitor,C#,Multithreading,Monitor,在同步上述代码时,为什么我要将对象传递给lock关键字。如果我同时传递,它将在何处使用。我知道它用于获取该对象上的锁。但我想知道如何深入获取对象上的锁。线程如何释放我们传递给lock关键字的对象上的锁。lock语句是使用Monitor方法实现线程同步的语法优势监视器表示对某些资源的独占锁定,在.NET中,资源是一个对象 为什么需要将对象引用提供给监视器?因为您希望在多线程环境中同步对整个对象的访问 线程如何释放我们在锁中传递的对象上的锁 关键词 请按如下方式考虑锁定: object c = ne

在同步上述代码时,为什么我要将对象传递给lock关键字。如果我同时传递,它将在何处使用。我知道它用于获取该对象上的锁。但我想知道如何深入获取对象上的锁。线程如何释放我们传递给lock关键字的对象上的锁。

lock
语句是使用
Monitor
方法实现线程同步的语法优势<代码>监视器表示对某些资源的独占锁定,在.NET中,资源是一个对象

为什么需要将对象引用提供给
监视器
?因为您希望在多线程环境中同步对整个对象的访问

线程如何释放我们在锁中传递的对象上的锁 关键词

请按如下方式考虑
锁定

object c = new object();
lock(c)
{
}
Monitor.Enter(obj);
尝试
{
//这将是“lock”块中的代码
}
最后
{
if(监视器IsEntered(obj))

Monitor.Exit(obj);//
lock
语句是使用
Monitor
方法进行线程同步的语法糖。
Monitor
表示某些资源上的独占锁,而在.NET中,资源是一个对象

为什么需要为
监视器
提供对象引用?因为您希望在多线程环境中同步对整个对象的访问

线程如何释放我们在锁中传递的对象上的锁 关键词

请按如下方式考虑
锁定

object c = new object();
lock(c)
{
}
Monitor.Enter(obj);
尝试
{
//这将是“lock”块中的代码
}
最后
{
if(监视器IsEntered(obj))

Monitor.Exit(obj);//您不需要将锁定限制在对象对象上,例如,您可以锁定字典对象,以防止其他线程从集合中添加或删除

如果不想使用lock关键字,可以使用[MethodImpl(MethodImplOptions.Synchronized)]

例如


您不需要将锁定限制在对象对象上,例如,您可以锁定Dictionary对象,以防止其他线程从集合中添加或删除

如果不想使用lock关键字,可以使用[MethodImpl(MethodImplOptions.Synchronized)]

例如


这里有五个问题;试着问每一个问题一个具体的问题;你更有可能得到一个好的答案。这里有五个问题;试着问每一个问题一个具体的问题;你更有可能得到一个好的答案。首先,字典是一个物体。第二,虽然这是可能的,但实际上是不可能的如果字典是公共的,这是一个坏主意。通过锁定公共可以访问的内容,这意味着您无法控制的代码可能会被锁定。这反过来会导致争用导致的性能问题或死锁导致的正确性问题。这也意味着您可以灵活地在将来更改锁定策略。最安全的做法是只锁定专用于锁定的私有对象。我还忘了提到CLR实现针对“只作为锁定对象使用”场景进行了优化。@EricLippert我们可以在任何地方了解到该优化?@YuvalItzchakov同步块可以有多种用途。CLR假设任何给定的对象不太可能需要同步块来完成两件事。我不想传递任何对象。我想在不传递对象的情况下进行同步。为什么需要同步对象。在java中,我们使用“同步”直接同步。我们不会在那里传递对象。我猜首先,字典是一个对象。其次,尽管这是可能的,但如果字典是公共的,实际上这是一个坏主意。通过锁定公共可以访问的内容,这意味着您无法控制的代码可能会被锁定。这反过来可能会由于争用或更正而导致性能问题由于死锁而导致的ess问题。这也意味着您可以灵活地在将来更改锁定策略。最安全的做法是只锁定专用于锁定的私有对象。我还忘了提到CLR实现针对“仅作为锁定对象使用”场景进行了优化。@EricLippert我们可以访问的任何地方了解该优化吗?@YuvalItzchakov同步块可以有多种用途。clr假设任何给定对象不太可能需要同步块来完成两件事。我不想传递任何对象。我想在不传递对象的情况下进行同步。为什么需要同步对象。在java中,我们直接使用“同步”进行同步1.我想我们不会经过那里的
 [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");
 }