C#相当于Java';s已同步(abc.class)

C#相当于Java';s已同步(abc.class),java,c#,multithreading,synchronization,Java,C#,Multithreading,Synchronization,我想知道是否有C#等价于以下Java代码: synchronized (abc.class) { // code here } 如果没有等价物,那么如何在C#中模拟它 abc是我的课程之一 abc属性和方法(其中一些是静态的)由多个线程同时访问 要锁定整个类,请使用以下命令: lock (typeof(abc)) { // code here } 要锁定整个类,请使用以下命令: lock (typeof(abc)) { // code here } 不要挡住课堂!这可能

我想知道是否有C#等价于以下Java代码:

synchronized (abc.class) {
   // code here
}
如果没有等价物,那么如何在C#中模拟它

  • abc
    是我的课程之一
  • abc
    属性和方法(其中一些是静态的)由多个线程同时访问

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

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

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

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

不要挡住课堂!这可能会导致代码中出现非常大的问题。相反,使用
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
        }
    }
}

此外,如果一个线程只需读取资源而不向其写入,则可以使用
读写锁定(
Slim
)进行同步。

不要阻止该类!这可能会导致代码中出现非常大的问题。相反,使用
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
        }
    }
}

此外,如果一个线程只需读取资源而不向其写入,则可以使用
ReadWriteLock
Slim
)进行同步。

这将是
lock(lockObj)
。请参阅:对于类,请使用
[MethodImpl(methodimpoptions.Synchronized)]
属性,对于属性/字段,应使用
lock(name)
。这是有问题的,因为当两个线程同时访问两个不同的方法,并且它们都访问同一个静态成员时,改变它并相互干扰。我需要整个类和它的成员被锁定,以让每个方法在不中断的情况下完成。这将是
lock(lockObj)
。请参阅:对于类,请使用
[MethodImpl(methodimpoptions.Synchronized)]
属性,对于属性/字段,应使用
lock(name)
。这是有问题的,因为当两个线程同时访问两个不同的方法,并且它们都访问同一个静态成员时,改变它并相互干扰。我需要整个类及其成员被锁定,以使每个方法在不中断的情况下完成。强烈建议不要这样做。@VMAtm:INTERTIONAL,它相当于原始Java代码。强烈建议不要这样做。@VMAtm:INTERTIONAL,除了VMAtm应答,请记住,如果线程位于method1内部,则没有线程可以进入method2,因为资源被锁定。如果每个方法都需要锁,请使用两个不同的资源对象。除了VMAtm应答之外,请记住,如果线程位于method1内部,则没有线程可以进入method2,因为资源已被锁定。如果每个方法都需要锁,请使用两个不同的资源对象。