Допустит, я объявил класс как это:Блокировка в многопоточных приложениях C#
public class PersistableObject<TObject> where TObject : class, new()
{
private readonly object objectLocker = new object();
private TObject persistableObject;
public TObject Object
{
get
{
lock (this.objectLocker)
{
return this.persistableObject;
}
}
set
{
lock (this.objectLocker)
{
this.persistableObject = value;
}
}
}
public bool Persist()
{
lock (this.objectLocker)
{
// Do Persist Object in file
}
}
public bool Retrieve()
{
lock (this.objectLocker)
{
// Do Retrieve Object from file
}
}
}
Этого класс отвечает за хранение переменного любого типа, сохраняется в файл и извлечь его из файла.
Как вы можете видеть, я использовал тот же замок (объект), чтобы заблокировать 4 операции:
- Получение реального объекта
- Установка фактического объекта
- сохранение объекта в файл
- Извлечение объекта из файла
Это правильный подход от параллелизм Точка зрения? Я полностью в безопасной зоне, учитывая, что этот класс используется разными потоками?
UPDATE:
Самое главное для меня здесь, только один поток должен иметь доступ к объекту в любой момент времени (независимо от того, что хочет получить, установить, восстановить или сохраняются его). Учитывая это, правильно ли он подходит? будут ли какие-либо тупики или другие неприятные вещи?
Это зависит от того, как вы планируете использовать его, и о том, что вызывающие приложения * ожидают * этого. Когда один поток идет и устанавливает значение, а затем сохраняет его прямо после этого, нормально ли для другого потока установить другое значение между этими двумя вызовами метода? – Servy
Скорее всего, вы планируете выполнять атомарные операции 'persist' и' retrieve', что не удается сделать полностью. –
@Servy Нет, это не нормально, но практически никто не будет устанавливать объект напрямую.Темы используют объект (который является списком) для добавления или удаления объектов, и я в порядке с ним, потому что любые изменения должны быть сохранены. – Arashv