Csharp/C#教程:c#中的方法锁定分享


c#中的方法锁定

我有一个类有这三种方法。 许multithreading都使用此类。 如果Method2和/或Method3在任何线程中运行,我希望Method1等待。 有什么建议?

public class Class1 { public static void Method1() { Object lockThis = new Object(); lock (lockThis) { //Body function } } public static void Method2() { //Body function } public static void Method3() { //Body function } } 

如果我理解正确,你需要这样的东西:

 static object lockMethod2 = new object(); static object lockMethod3 = new object(); public static void Method1() { lock (lockMethod2) lock (lockMethod3) { //Body function } } public static void Method2() { lock (lockMethod2) { //Body function } } public static void Method3() { lock (lockMethod3) { //Body function } } 

这允许method3在method2运行时执行,反之亦然,而method1必须等待两者。 当然,方法2和3在1运行时不会运行。

锁的当前实现完全没用,因为每个线程都会锁定不同的对象。
锁定通常使用仅初始化一次的只读字段来完成。
像这样,您可以轻松锁定多种方法:

 public class Class1 { private static readonly object _syncRoot = new object(); public static void Method1() { lock (_syncRoot) { //Body function } } public static void Method2() { lock (_syncRoot) { //Body function } } public static void Method3() { lock (_syncRoot) { //Body function } } } 

我建议使用ReaderWriterLockSlim ( https://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx )

与读操作类似,方法2和方法3可以并行发生,而Method1(如写操作)需要等待那些完成。 这不是常规的读/写并发情况,但逻辑是类似的。

 public class Class1 { private ReaderWriterLockSlim methodLock = new ReaderWriterLockSlim(); public static void Method1() { methodLock.EnterWriteLock(); try { //Body function } finally { methodLock.ExitWriteLock(); } } public static void Method2() { methodLock.EnterReadLock(); try { //Body function } finally { methodLock.ExitReadLock(); } } public static void Method3() { methodLock.EnterReadLock(); try { //Body function } finally { methodLock.ExitReadLock(); } } } 

如果您是multithreading,那么所有线程都必须可以访问lock 。 因此,在这种情况下,您的锁需要是静态的,静态方法才能看到它。

您当前的设置将为每个线程创建一个新的锁定对象。 因此,现在提供同步。

上述就是C#学习教程:c#中的方法锁定分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1043106.html

(0)
上一篇 2022年1月31日
下一篇 2022年1月31日

精彩推荐