C# 锁在不同的方法中使用

C# 锁在不同的方法中使用,c#,locking,C#,Locking,我有一个关于锁定的问题,以及我是否做得对 在一个类中,我有一个静态锁对象,它在几个方法中使用,假设访问修饰符设置正确,我不会列出它们以保持简洁 class Foo { static readonly object MyLock = new object(); void MethodOne() { lock(MyLock) { // Dostuff } } void MethodTwo() {

我有一个关于锁定的问题,以及我是否做得对

在一个类中,我有一个静态锁对象,它在几个方法中使用,假设访问修饰符设置正确,我不会列出它们以保持简洁

class Foo
{ 
   static readonly object MyLock = new object();

   void MethodOne()
   {
       lock(MyLock) { 
          // Dostuff
       }
   }

   void MethodTwo()
   {
       lock(MyLock) { 
          // Dostuff
       }
   }
}
现在,按照我的理解,锁保证一次只有一个线程能够抓取它并进入一个方法的DoStuff()部分

但是同一个线程是否可以同时调用MethodOne()和MethodTwo()?这意味着他使用两种方法的锁

我想要的功能是,该类中的每个方法只能由单个线程调用,而该类中当前没有其他方法正在执行

基本用法是一个数据库类,我只需要一个入口和出口点。它使用SQLCompact,所以如果我试图读取受保护的数据,就会出现各种各样的内存错误

让我补充一下,每隔一段时间数据库就会发生内存异常,我不知道它是从哪里来的。我认为这是因为一个线程在完成任务之前对数据库做了多项工作,但这段代码似乎工作正常

但是同一个线程是否可以同时调用MethodOne()和MethodTwo()

单个线程不可能同时调用任何内容

在多线程应用程序中,这可能会发生-可以同时调用方法,但只能按顺序访问
//Dostuff
部分

我想要的功能是,该类中的每个方法只能由单个线程调用,而该类中当前没有其他方法正在执行

然后不要在应用程序中使用额外的线程——只使用主线程,不要使用额外的线程

但是同一个线程是否可以同时调用MethodOne()和MethodTwo()

单个线程不可能同时调用任何内容

在多线程应用程序中,这可能会发生-可以同时调用方法,但只能按顺序访问
//Dostuff
部分

我想要的功能是,该类中的每个方法只能由单个线程调用,而该类中当前没有其他方法正在执行

然后不要在应用程序中使用额外的线程——只使用主线程,不要使用额外的线程

但是同一个线程是否可以同时调用MethodOne()和MethodTwo()

不可以。同一线程不能同时调用这两个方法,无论是否在上使用
lock

lock(MyLock) 
可以理解为:

MyLock
对象有一个键可以输入自身。首先访问它的线程(比如t1)将获得它。其他线程必须等待
t1
释放它。但是
t1
可以调用另一个方法,并将通过此行,因为它已经获得了锁

但是,同时调用这两个方法。。。单线程不可能。在当前的编程世界中不是这样的

按照我的理解,锁保证一次只有一个线程能够抓取它并进入一个方法的DoStuff()部分

您的理解是正确的,但请记住线程用于并行执行,但线程内的执行始终是顺序的

但是同一个线程是否可以同时调用MethodOne()和MethodTwo()

不可以。同一线程不能同时调用这两个方法,无论是否在上使用
lock

lock(MyLock) 
可以理解为:

MyLock
对象有一个键可以输入自身。首先访问它的线程(比如t1)将获得它。其他线程必须等待
t1
释放它。但是
t1
可以调用另一个方法,并将通过此行,因为它已经获得了锁

但是,同时调用这两个方法。。。单线程不可能。在当前的编程世界中不是这样的

按照我的理解,锁保证一次只有一个线程能够抓取它并进入一个方法的DoStuff()部分


您的理解是正确的,但请记住线程用于并行执行,但线程内的执行始终是顺序的。

运行的
MethodOne
Dostuff
中的线程调用
MethodTwo
的唯一方法是让
MethodOne
Dostuff
执行调用
MethodTwo
。如果没有发生这种情况(即“相互锁定”组中的方法不相互调用),则您是安全的。

运行的
MethodOne
Dostuff
中的线程调用
MethodTwo
的唯一方法是
MethodOne
Dostuff
调用
MethodTwo
。如果没有发生这种情况(即“相互锁定”组中的方法不会相互调用),则您是安全的。

这里可以回答一些问题

但是同一个线程是否可以调用MethodOne()和 方法两个()同时使用?也就是说他用的是自己的锁 两种方法都有

不,线程只有一个程序计数器,它位于
MethodOne()
MethodTwo()
中。但是如果你有如下的东西

public void MethodThree()
{
    lock (MyLock)
    {
        MethodOne();
        MethodTwo();
    }
}
这也会起作用,一个线程可以多次获得相同的锁。请注意您正在做的事情,因为随着代码变得更加复杂,您很容易陷入死锁

我想要的功能是,这个类中的每个方法只能 在该类中没有其他方法被调用时,由单个线程调用 目前正在执行

基本用法是一个数据库类,我只需要一个 单一入口和出口点。它使用sqlcom