我可以使用ContextBoundObject创建线程安全对象吗?

时间:2011-02-07 12:02:47

标签: .net multithreading thread-safety

我有一个服务于多个请求(线程)的对象......想一想跨多个线程的SqlConnection对象....

现在,我想创建一个“Thread”安全对象,它知道创建的线程上下文。

因此,如果Thread1创建对象foo并且Thread2尝试访问它....对象foo将忽略它并且只有在Thread1运行时才“动作”...

ContextBoundObject会这样做吗?如果是的话,它的局限性是什么?

伪代码

public class Foo
{       
   private int _threadId; 

   public void DoSomething()
   {
       (if thread.ManagedThreadId != _threadId) return;

      // Do some thread safe stuff
   }

}

2 个答案:

答案 0 :(得分:0)

您希望实现的行为可以使用SynchronizationAttribute

但是,使用此属性将序列化对该类的所有成员的访问。另一方面,如果类的某些方法不需要使用同步属性进行同步(如不共享任何状态的静态方法),则可能导致性能下降。

答案 1 :(得分:0)

是的,您可以通过实现ContextBoundObject并使用Synchronization属性注释该类来实现线程安全。但是,仅当您需要类级别锁定(即所有方法/属性等)并且由于有时它容易出现死锁和较差的并发性时,才建议这样做。

在只有少数方法需要锁定的情况下,更好的解决方案是使用lock关键字进行手动锁定,该关键字是抽象的,轻量级的,并且较少暴露于死锁。

希望这会有所帮助!!