2017-03-08 155 views
1

我想知道是否有C#等同于Java代码的:C#相当于Java的同步(abc.class)的

synchronized (abc.class) { 
    // code here 
} 

如果没有等价物,那我怎么才能模拟它在C#中?

  • abc是我的程序中的一个类。
  • abc属性和方法(其中一些是静态的)是许多线程同时访问的。
+0

这将是'lock(lockObj)'。请参阅:https://msdn.microsoft.com/en-us/library/c5kehkcz.aspx – Fildor

+0

对于类,请使用'[MethodImpl(MethodImplOptions.Synchronized)]'属性,对于属性/字段应该使用'lock(name) '。 –

+0

这是有问题的,因为当这个abc类被2个线程同时访问2个不同的方法时,它们都访问相同的静态成员,改变它并相互干扰。我需要整个班级,它的成员锁定,让每个方法完成不中断。 – user3080008

回答

-1

要锁定整个类,使用以下命令:

lock (typeof(abc)) 
{ 
    // code here 
} 
+0

这是极不推荐的。 – VMAtm

+0

@VMAtm:无论如何,它都等同于原始的Java代码。 –

1

不要阻塞类!这可能会导致代码中出现非常大的问题。相反,使用lock结构从代码中访问静态资源:

class Abc 
{ 
    private static object _resource; 
    static Abc() 
    { 
     _resource = new object(); 
    } 

    public static void Method1() 
    { 
     lock (_resource) 
     { 
      // this will run for only one thread at a time 
     } 
    } 

    public static void Method2() 
    { 
     lock (_resource) 
     { 
      // this will run for only one thread at a time 
     } 
    } 
} 

此外,您还可以使用ReadWriteLockSlim)为同步,如果一个线程只需要读取的资源,而无需编写它。

+0

除了VMAtm答案之外,请记住,如果自从资源被锁定以来线程位于method1内部,则线程无法在method2中输入。如果你需要锁定每个方法,使用两个不同的资源对象。 – panox