Как лучше использовать блокировку внутри унаследованных классов? - PullRequest
10 голосов
/ 21 мая 2010

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

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

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

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

Ответы [ 2 ]

11 голосов
/ 21 мая 2010

Второй вариант можно найти довольно часто в .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;
      }
    }
  }
}
4 голосов
/ 21 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...