Sor*_*raz 303 c# java multithreading synchronization
c#是否有自己的java"synchronized"关键字版本?
即在java中,它可以指定为函数,对象或代码块,如下所示:
public synchronized void doImportantStuff() {
// dangerous code goes here.
}
Run Code Online (Sandbox Code Playgroud)
要么
public void doImportantStuff() {
// trivial stuff
synchronized(someLock) {
// dangerous code goes here.
}
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*ell 453
首先 - 大多数类永远不需要是线程安全的.使用YAGNI:只有当您知道实际要使用它时才应用线程安全(并测试它).
对于方法级别的东西,有[MethodImpl]:
[MethodImpl(MethodImplOptions.Synchronized)]
public void SomeMethod() {/* code */}
Run Code Online (Sandbox Code Playgroud)
这也可用于访问器(属性和事件):
private int i;
public int SomeProperty
{
[MethodImpl(MethodImplOptions.Synchronized)]
get { return i; }
[MethodImpl(MethodImplOptions.Synchronized)]
set { i = value; }
}
Run Code Online (Sandbox Code Playgroud)
请注意,默认情况下,类似字段的事件是同步的,而自动实现的属性不是:
public int SomeProperty {get;set;} // not synchronized
public event EventHandler SomeEvent; // synchronized
Run Code Online (Sandbox Code Playgroud)
就个人而言,我不喜欢MethodImpl锁定this或typeof(Foo)- 这是违反最佳做法的实施.首选方法是使用自己的锁:
private readonly object syncLock = new object();
public void SomeMethod() {
lock(syncLock) { /* code */ }
}
Run Code Online (Sandbox Code Playgroud)
请注意,对于类似字段的事件,锁定实现依赖于编译器; 在较旧的Microsoft编译器中它是lock(this)/ lock(Type)- 但是,在最近的编译器中它使用Interlocked更新 - 所以线程安全没有讨厌的部分.
这允许更细粒度的使用,并允许使用Monitor.Wait/ Monitor.Pulseetc在线程之间进行通信.
Jan*_*ann 54
static object Lock = new object();
lock (Lock)
{
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
Kon*_*lph 39
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)]