我想知道一个类是否继承自另一个类,最好让这些类共享一个在基类中定义的锁对象,或者在每个继承级别定义一个锁对象。
类的每个级别上的锁定对象的一个非常简单的示例
public class Foo {
private object thisLock = new object();
private int ivalue;
public int Value {
get {
lock( thisLock ) {
return ivalue;
}
}
set {
lock( thisLock ) {
ivalue= value;
}
}
}
}
public class Foo2: Foo {
private object thisLock2 = new object();
public int DoubleValue {
get {
lock( thisLock2 ) {
return base.Value * 2;
}
}
set {
lock( thisLock2 ) {
base.Value = value / 2;
}
}
}
}
public class Foo6: Foo2 {
private object thisLock6 = new object();
public int TripleDoubleValue {
get {
lock( thisLock6 ) {
return base.DoubleValue * 3;
}
}
set {
lock( thisLock6 ) {
base.DoubleValue = value / 3;
}
}
}
}
共享锁对象的一个非常简单的例子
public class Foo {
protected object thisLock = new object();
private int ivalue;
public int Value {
get {
lock( thisLock ) {
return ivalue;
}
}
set {
lock( thisLock ) {
ivalue= value;
}
}
}
}
public class Foo2: Foo {
public int DoubleValue {
get {
lock( thisLock ) {
return base.Value * 2;
}
}
set {
lock( thisLock ) {
base.Value = value / 2;
}
}
}
}
public class Foo6: Foo2 {
public int TripleDoubleValue {
get {
lock( thisLock ) {
return base.DoubleValue * 3;
}
}
set {
lock( thisLock ) {
base.DoubleValue = value / 3;
}
}
}
}
哪个示例是在继承类中管理锁定的首选方法?
答案 0 :(得分:11)
您可以在.NET Framework中经常使用属性而不是字段找到第二个选项(例如,CommunicationObject.ThisLock Property):
public class Foo {
private readonly object thisLock = new object();
private int ivalue;
protected object ThisLock {
get {
return thisLock;
}
}
public int Value {
get {
lock( ThisLock ) {
return ivalue;
}
}
set {
lock( ThisLock ) {
ivalue= value;
}
}
}
}
和
public class Foo2: Foo {
public int DoubleValue {
get {
lock( ThisLock ) {
return base.Value * 2;
}
}
set {
lock( ThisLock ) {
base.Value = value / 2;
}
}
}
}
答案 1 :(得分:4)
您拥有的锁定对象的实例数应该等于您尝试控制访问权限的数量。如果所有子类共享相同的资源,则应该有一个锁对象,例如基类中的字段/属性。