2016-10-08 2 views
1

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

В моем приложении мой объект может записать его в файл и обновить свойство number_of_lines для каждой записи.

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

Скажем, например, поток T1 регистрируется в момент 10:10:10, а T2 также регистрируется в то же точное время и обе пытается обновить свойство number_of_lines.

Как решить эту проблему? Есть ли альтернативный шаблон проектирования, чтобы решить эту проблему. Спасибо за ваше время.

+0

«Как он себя ведет, и я чувствую, что свойство number_of_lines должно блокироваться, когда другие потоки пытаются обновить, и я могу потерять регистрацию данных с задержкой, и производительность будет терять». не знаю, что вы здесь имеете в виду. Но я думаю, вам нужно заблокировать функцию 'writeToFile' (или ваш файл будет испорчен) и поле' number_of_lines', чтобы сделать значение атомарным. –

+0

есть. если я заблокирую как writeToFile, так и поле number_of_lines. я закончу с потерей производительности, поскольку другие операции записи будут ждать в очереди и не смогут регистрироваться в точное время – sanjayzed

+0

OK Я дам вам 2 решения: 1. укажите время в сообщении. 2. Напишите несколько файлов. (потеря не теряется) –

ответ

0

Вы можете синхронизировать доступ ко всему файлу, как вы уже сделали, или есть альтернатива с некоторыми против: мгновенных снимков.

  • N потоки пишут содержимое файла в string переменной.
  • Специальный поток выполняет моментальные снимки данных в памяти на диск и обновления number_of_lines. number_of_lines будет синхронизироваться, когда этот выделенный поток должен обновить его. Съемка может происходить с временными интервалами, такими как 10 секунд, 1 минута, 1 час ...

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

0

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

Смежные вопросы