0

一个简单的线程练习。假设我有一个静态锁、一个 Web 请求和一个线程队列线程。以下是否会导致问题(忽略代码本身的质量):

static object locker = new object();
static MyObject obj = new MyObject();

public static void Update(){
   lock(locker){
      obj.Foo = "biz";
      DoStuff();
   }
}

public static void DoStuff(){
   ThreadPool.QueueUserWorkItem(args => {
      lock(locker){
         obj.Foo = "bar";
      }
   });
}

这个例子是人为的,但这个概念是成立的:)。

4

2 回答 2

3

这不会引起问题。如果这被调用一次,DoStuff()将无法获取锁,直到Update()'s 的代码退出锁。但是,ThreadPool.QueueUserWorkItem是一个异步调用,所以锁将能够被释放,这反过来将允许DoStuff()处理。

于 2013-10-10T22:31:14.347 回答
1

它不应该。线程池线程的唯一问题是线程池增长相对缓慢,因此如果您阻塞了很多等待锁,您可能会导致性能问题。

于 2013-10-10T22:33:38.760 回答