我想知道是否有C#等同于Java代码的:C#相当于Java的同步(abc.class)的
synchronized (abc.class) {
// code here
}
如果没有等价物,那我怎么才能模拟它在C#中?
abc
是我的程序中的一个类。abc
属性和方法(其中一些是静态的)是许多线程同时访问的。
我想知道是否有C#等同于Java代码的:C#相当于Java的同步(abc.class)的
synchronized (abc.class) {
// code here
}
如果没有等价物,那我怎么才能模拟它在C#中?
abc
是我的程序中的一个类。abc
属性和方法(其中一些是静态的)是许多线程同时访问的。要锁定整个类,使用以下命令:
lock (typeof(abc))
{
// code here
}
这是极不推荐的。 – VMAtm
@VMAtm:无论如何,它都等同于原始的Java代码。 –
不要阻塞类!这可能会导致代码中出现非常大的问题。相反,使用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
)为同步,如果一个线程只需要读取的资源,而无需编写它。
除了VMAtm答案之外,请记住,如果自从资源被锁定以来线程位于method1内部,则线程无法在method2中输入。如果你需要锁定每个方法,使用两个不同的资源对象。 – panox
这将是'lock(lockObj)'。请参阅:https://msdn.microsoft.com/en-us/library/c5kehkcz.aspx – Fildor
对于类,请使用'[MethodImpl(MethodImplOptions.Synchronized)]'属性,对于属性/字段应该使用'lock(name) '。 –
这是有问题的,因为当这个abc类被2个线程同时访问2个不同的方法时,它们都访问相同的静态成员,改变它并相互干扰。我需要整个班级,它的成员锁定,让每个方法完成不中断。 – user3080008