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