Какова лучшая практика для использования блокировки в наследованных классах

Я хочу знать, наследовался ли один класс от другого, это лучше, чтобы иметь долю классов объект блокирования, который определяется в базовом классе или определить объект блокирования на каждом уровне наследования.

Очень простой пример объекта блокирования на каждом уровне класса

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;
      }
    }
  }
}

Какой пример предпочтительный путь состоит в том, чтобы справиться с блокировкой в наследованном классе?

10
задан dtb 21 May 2010 в 15:03
поделиться

2 ответа

Второй вариант довольно часто можно найти в .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;
      }
    }
  }
}
11
ответ дан 3 December 2019 в 22:35
поделиться

Количество имеющихся у вас экземпляров объекта блокировки должно равняться количеству вещей, доступ к которым вы пытаетесь контролировать. Если все подклассы совместно используют один и тот же ресурс, тогда должен быть один объект блокировки, например, поле / свойство в базовом классе.

4
ответ дан 3 December 2019 в 22:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: