哪种方式最适合线程同步?

时间:2014-12-07 16:31:54

标签: c# multithreading thread-safety

哪个最强大? 有什么区别?

1

[Synchronization]
public class Person : ContextBoundObject
{
    public void Print(){
        Console.WriteLine ("Start");
        Thread.Sleep (100);
        Console.WriteLine ("END");
    }
}

2

        private readonly object obj = new object();
        public void Print(){
            lock (obj) {
                Console.WriteLine ("Start");
                Thread.Sleep (100);
                Console.WriteLine ("END");
            }
        }

顺便说一句,主要:

            Person a = new Person ();
            for (int i = 0; i < 10; i++) {
                new Thread (a.Print).Start ();
            }

我们可以使用这两种方式互换吗?

2 个答案:

答案 0 :(得分:3)

SynchronizationAttributeContextBoundObject是.NET Remoting概念;它们不适用于通用代码,只能在完整的.NET框架上运行(不适用于Windows Phone,Windows应用商店应用或Silverlight)。此外,它会强制您让您的类继承ContextBoundObject,这可能是不可取的。

另一方面,lock可以在任何地方使用,并且不会强迫您继承特定的类;它也更细粒度,因为你可以将它应用于需要它的代码,而不是整个类。

因此,除非您的代码专门与远程处理有关,否则我建议不要使用[Synchronization]

答案 1 :(得分:0)

我会在方法2上强烈推荐方法1.我将您的问题视为高级别的现实世界实施策略类型的问题。

将Print方法想象为“DoMyMainObjectWorkInThisNewThread()”然后使用新的Thread()设置的模型.Start()会有一个对象在那里执行,然后可以与Person对象上的方法与其他线程进行交互在你的Person类中受到保护。

如果您锁定整个对象,则无法在类级别(例如“当前状态”消息)轻松与您的线程进行交互。

从长远来看,您的方法“1”将保证您具有最大的灵活性,因为您可以使用仅提供锁定的互斥锁或对象,然后使用委托与长时间运行的进程进行交互。 (我假设Thread.Sleep是一个占位符,用于您无法控制的长时间运行的进程。) 然后,您不需要[Synchronization]类属性,并且可以设置更自由的线程方法。

此外,您的方案2将排队打印命令。所以&#34; TryLock&#34;您的Person对象上的概念或新方法,例如&#34; IsPrinting()&#34;或&#34; CanPrint()&#34;可以实施。