2011-02-07 81 views
1

我有一个对象,它服务于多个请求(线程)...思考跨多个线程的SqlConnection对象...我可以使用ContextBoundObject创建线程安全对象吗?

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

所以,如果线程1创建对象foo及线程试图访问它....对象foo会忽略它,只有“行为”,如果线程1正在运行...

威尔ContextBoundObject这样做呢?如果是的话,它有什么限制?

伪代码,你想达到

public class Foo 
{  
    private int _threadId; 

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

     // Do some thread safe stuff 
    } 

} 
+1

在进入如何做到这一点之前?你能否提供你为什么要这样做的细节?也许有更好的解决方案来实现你正在寻找的东西。 – 2011-03-05 00:51:51

+0

我想这样做是因为我想要“线程安全”的实例......包括方法调用和属性访问。 我不相信“此对象对于多线程访问不安全”。 – 2011-03-07 08:05:29

回答

0

行为可以通过SynchronizationAttribute进行。

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

0

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

在只有少数方法需要锁定的情况下,更好的解决方案是使用锁定关键字进行手动锁定,锁定关键字是抽象的,轻量级的,并且不会受到死锁的影响。

希望这有助于!

相关问题