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