Skip to main content
 首页 » 编程设计

c#之锁定传递的对象会发生什么

2024年01月18日28TianFang

我在一个项目中使用线程。我正在尝试创建一个不会“破坏”数据的安全线程。我的线程在后台运行并调用另一个类的函数,我可以调用 Go 和 Go2,一个函数从列表中添加和删除。我不希望他们同时运行,下面的情况有什么区别:

static readonly object _locker1 = new object(); 
static readonly object _locker2 = new object(); 
 
 
public void Go(Object something) 
{ 
  lock (_locker1) 
  { 
    myList.add(something); 
  } 
} 
 
public void Go2(Object something) 
{ 
  lock (_locker2) 
  { 
    myList.Remove(something); 
  } 
} 

如果我将 Go2 替换为:

public void Go2(Object something) 
{ 
  lock (_locker1) 
  { 
    myList.Remove(something); 
  } 
} 

注意锁定参数。

第三种情况可以帮助我理解,假设我从另一个线程 (thread2) 调用 Go,它能否运行,因为 _locker1 被 thread2 锁定,而 Go2(具有被 thread2 锁定的 _locker 1)被调用线程 1?

static readonly object _locker1 = new object(); 
static readonly object _locker2 = new object(); 
 
 
public void Go(Object something) 
{ 
  lock (_locker1) 
  { 
    //Can I call Go2 which is locked by the same object? 
    Go2(something); 
  } 
} 
 
public void Go2(Object something) 
{ 
  lock (_locker1) 
  { 
    myList.Remove(something); 
  } 
} 

谁能解释传递给 lock 的值的作用?

请您参考如下方法:

很简单:如果两个锁使用同一个对象,它们就不会同时运行。在您的第一个片段中,由于 Go 和 Go2 锁定不同的对象,它们可能同时运行并做坏事。