Java中的synchronized关键字在C#中对应什么?
Java中的synchronized关键字在C#中对应什么?
C#有自己的版本来实现Java的\"synchronized\"关键字吗?
即在Java中可以指定函数、对象或一段代码块,像这样:
public synchronized void doImportantStuff() { // dangerous code goes here. }
或者
public void doImportantStuff() { // trivial stuff synchronized(someLock) { // dangerous code goes here. } }
admin 更改状态以发布 2023年5月21日
首先 - 大多数类永远不需要线程安全。使用YAGNI原则:只有在确实需要使用并测试线程安全时才应用它。
对于方法级别的内容,有[MethodImpl]
:
[MethodImpl(MethodImplOptions.Synchronized)] public void SomeMethod() {/* code */}
这也可以用于访问器(属性和事件):
private int i; public int SomeProperty { [MethodImpl(MethodImplOptions.Synchronized)] get { return i; } [MethodImpl(MethodImplOptions.Synchronized)] set { i = value; } }
请注意,类似字段的事件默认情况下会进行同步,而自动实现属性则不会:
public int SomeProperty {get;set;} // not synchronized public event EventHandler SomeEvent; // synchronized
个人而言,我不喜欢MethodImpl
的实现,因为它锁定了this
或typeof(Foo)
- 这违反了最佳实践。首选选项是使用自己的锁:
private readonly object syncLock = new object(); public void SomeMethod() { lock(syncLock) { /* code */ } }
请注意,对于类似字段的事件,锁定实现取决于编译器;在旧的Microsoft编译器中,它是一个lock(this)
/ lock(Type)
- 然而,在更近期的编译器中它使用了Interlocked
更新 - 因此是线程安全的而没有不好的部分。
这允许更细粒度的使用,并允许使用Monitor.Wait
/ Monitor.Pulse
等在线程之间进行通信。