Я хочу знать, наследовался ли один класс от другого, это лучше, чтобы иметь долю классов объект блокирования, который определяется в базовом классе или определить объект блокирования на каждом уровне наследования.
Очень простой пример объекта блокирования на каждом уровне класса
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;
}
}
}
}
Какой пример предпочтительный путь состоит в том, чтобы справиться с блокировкой в наследованном классе?
Второй вариант довольно часто можно найти в .NET Framework, хотя и используя свойство вместо поля (например, Свойство CommunicationObject.ThisLock ):
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;
}
}
}
}
Количество имеющихся у вас экземпляров объекта блокировки должно равняться количеству вещей, доступ к которым вы пытаетесь контролировать. Если все подклассы совместно используют один и тот же ресурс, тогда должен быть один объект блокировки, например, поле / свойство в базовом классе.