C#版的java synchronized关键字?

C# version of java's synchronized keyword?

C++有自己的Java"同步"关键字吗?

即在Java中,它可以被指定给函数、对象或代码块,如:

1
2
3
public synchronized void doImportantStuff() {
   // dangerous code goes here.
}

1
2
3
4
5
6
7
public void doImportantStuff() {
   // trivial stuff

   synchronized(someLock) {
      // dangerous code goes here.
   }
}


第一-大多数类永远不需要是线程安全的。使用yagni:只有当你知道你将要使用它(并测试它)时才应用线程安全。

对于方法级的东西,有[MethodImpl]

1
2
[MethodImpl(MethodImplOptions.Synchronized)]
public void SomeMethod() {/* code */}

这也可用于访问器(属性和事件):

1
2
3
4
5
6
7
8
private int i;
public int SomeProperty
{
    [MethodImpl(MethodImplOptions.Synchronized)]
    get { return i; }
    [MethodImpl(MethodImplOptions.Synchronized)]
    set { i = value; }
}

注意,默认情况下类似字段的事件是同步的,而自动实现的属性不是:

1
2
public int SomeProperty {get;set;} // not synchronized
public event EventHandler SomeEvent; // synchronized

我个人不喜欢执行MethodImpl,因为它锁定了thistypeof(Foo),这违背了最佳实践。首选选项是使用您自己的锁:

1
2
3
4
private readonly object syncLock = new object();
public void SomeMethod() {
    lock(syncLock) { /* code */ }
}

请注意,对于类似字段的事件,锁定实现依赖于编译器;在旧的Microsoft编译器中,锁定实现是一个lock(this)lock(Type)-但是,在较新的编译器中,锁定实现使用Interlocked-这样线程安全,不存在不好的部分。

这允许更精细的使用,并允许使用Monitor.Wait/Monitor.Pulse等在线程之间进行通信。

相关的博客条目(稍后重新访问)。


1
2
3
4
5
6
static object Lock = new object();

lock (Lock)
{
// do stuff
}


Does c# have its own version of the java"synchronized" keyword?

不需要。在C中,您显式地使用希望跨异步线程同步处理的cx1(0)资源。lock打开一个块;它不在方法级别上工作。

但是,底层机制是类似的,因为lock通过在运行时调用Monitor.Enter(随后调用Monitor.Exit)工作。根据Sun文档,Java的工作方式是一样的。


请注意,使用完整的路径,行:[MethodImpl(MethodImplOptions.Synchronized)]应该看起来像

[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]


您可以使用lock语句来代替。我想这只能代替第二种版本。另外,请记住,synchronizedlock都需要在对象上操作。