哪种方式最适合线程同步

本文关键字:线程 同步 方式最 | 更新日期: 2023-09-27 18:33:36

哪个最健壮?有什么区别?

1.

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

阿拉伯数字。

        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 ();
            }

我们可以使用这种双向互换吗?

哪种方式最适合线程同步

SynchronizationAttributeContextBoundObject是.NET Remoting概念;它们不适用于通用代码,并且仅适用于完整的.NET框架(不适用于Windows Phone,Windows Store应用程序或Silverlight(。此外,它迫使你让你的类继承ContextBoundObject,这可能是不可取的。

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

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

我会强烈投票支持方法 1 而不是方法 2。 我把你的问题作为一个高层次的现实世界实施策略类型的问题。

将 Print 方法视为"DoMyMainObjectWorkInThisNewThread((",然后使用新 Thread (( 设置模型。Start (( 将在那里执行一个对象,然后可以使用您在 Person 类中保护的 Person 对象上的方法与其他线程进行交互。

如果锁定整个对象,则无法在类级别与线程轻松交互,例如"当前状态"消息。

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

此外,您的方案 2 会将"打印"命令排队。 因此,可以在您的 Person 对象上实现"TryLock"概念或新方法,例如"IsPrinting(("或"CanPrint(("。