2014-10-14 2 views
3
public abstract BaseClass 
{ 
    private static readonly object _filelockStatic = new object(); 
    private readonly object _filelock = new object(); 

    public void StaticLock() 
    { 
     lock(_filelockStatic) 
     { 
      //Edit a common text file (common to all children) 
     } 
    } 

    public void InstanceLock() 
    { 
     lock(_filelock) 
     { 
      //Edit a common text file (common to all children) 
     } 
    } 
} 

Если у меня есть абстрактный класс с методом, который редактирует текстовый файл (один текстовый файл, общий для всех экземпляров дочернего класса), чтобы сделать его потокобезопасным нужно заблокировать статический член или это не имеет значения?блокировка статической или переменной экземпляра в абстрактном классе

Иными словами, в приведенном выше примере кода существует разница между InstanceLock() и StaticLock() с точки зрения безопасности потоков?

+1

Если класс * не * 'abstract', вы уже знаете ответ на этот вопрос? По сравнению с не-абстрактным классом, который служит базовым классом для других классов? –

+0

Не совсем ... Я предполагаю, что член «блокировки» должен быть статичным, но я не мог найти подтверждение 100% при поиске в Google, поэтому я думал, что опубликую, чтобы быть уверенным на 100%. Но также, статический замок достаточно хорош? Но, конечно, «абстрактная» не имеет к этому никакого отношения, более просто для иллюстрации того, что класс будет унаследован от – Dan

+0

@Dan: «это статический замок достаточно хорош» - вы должны опубликовать критерии. – Dennis

ответ

3

Существует разница, так как InstanceLock позволит двум экземплярам производных классов редактировать файл одновременно. Это связано с тем, что блокировка не используется между экземплярами. Предпочитают статический замок, как это будет препятствовать любой производный класс от входа в lock(_filelockStatic) область от разных потоков до тех пор, пока вы находитесь в the same app domain

var o1 = new DerivedClass(); 
var o2 = new DerivedClass(); 

// o1._filelock != o2._filelock 
// o1._filelockStatic == o2._filelockStatic 
Смежные вопросы