java同步关键字的C版本?

c#是否有自己版本的java“synchronized”关键字

也就是说,在java中,可以将其指定给函数、对象或代码块,如下所示:

公共同步void doImportantStuff(){
//这里有危险代码。
}

公共void doImportantStuff(){
//琐事
已同步(someLock){
//这里有危险代码。
}
}

首先,大多数类永远不需要是线程安全的。使用YAGNI:只有当你知道你实际上要使用它(并测试它)时才应用线程安全性

对于方法级别的内容,有[MethodImpl]

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

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

私有int i;
公共属性
{
[MethodImpl(MethodImplOptions.Synchronized)]
获取{return i;}
[MethodImpl(MethodImplOptions.Synchronized)]
设置{i=value;}
}

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

public int SomeProperty{get;set;}//未同步
公共事件处理程序SomeEvent;//同步的

就我个人而言,我不喜欢MethodImpl的实现,因为它会锁定thistypeof(Foo)——这违反了最佳实践。首选选项是使用您自己的锁:

私有只读对象syncLock=new object();
公共方法(){
锁(同步锁){/*代码*/}
}

注意,对于类似字段的事件,锁定实现依赖于编译器;在旧的Microsoft编译器中,它是一个锁(this)/锁(Type)-但是,在较新的编译器中,它使用了互锁的更新,因此线程安全,没有令人讨厌的部分

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

相关的博客条目(稍后再次访问

发表评论