c#是否有自己的java"synchronized"关键字版本?
即在java中,它可以指定为函数,对象或代码块,如下所示:
public synchronized void doImportantStuff() { // dangerous code goes here. }
要么
public void doImportantStuff() { // trivial stuff synchronized(someLock) { // dangerous code goes here. } }
Marc Gravell.. 453
首先 - 大多数类永远不需要是线程安全的.使用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
etc在线程之间进行通信.
相关博客条目(稍后重访).
首先 - 大多数类永远不需要是线程安全的.使用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
etc在线程之间进行通信.
相关博客条目(稍后重访).
static object Lock = new object(); lock (Lock) { // do stuff }
c#是否有自己的java"synchronized"关键字版本?
在C#中,您明确地lock
要跨异步线程同步处理资源.lock
打开一个街区; 它不适用于方法级别.
但是,底层机制类似,因为lock
通过调用Monitor.Enter
(和随后Monitor.Exit
)运行时来工作.根据Sun文档,Java的工作方式相同.
注意,完整路径线:[MethodImpl(MethodImplOptions.Synchronized)]
应该看起来像
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]
您可以改用该lock
语句.我认为这只能取代第二个版本.此外,请记住,这两个synchronized
并lock
需要一个对象进行操作.