2016-10-08 59 views
1

我有一個稱爲FILELOGGER的單身人士班級和名爲number_of_lines的屬性。 我將確保只有一個對象能夠爲創建單身人士的類別FILELOGGER創建。多線程環境中的單身人士

在我的應用程序中,我的對象能夠將它寫入文件併爲每次寫入更新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

好的,我會給你2個解決方案:1.在消息中包含時間。 2.寫入多個文件。 (失去不失去順便說一句) –

回答

0

因爲你已經做了你可以同步訪問整個文件,或有一些缺點一個替代:快照

  • Ñ線程寫入文件的內容到一個string變量。
  • 專用線程將內存數據快照到磁盤並更新number_of_lines。當這個專用線程需要更新它時,number_of_lines將被同步。快照可能發生的時間間隔像10秒,1分鐘,1小時...

這種方法的主要問題是應用程序/系統崩潰將意味着失去,因爲這是不保存在磁盤中的數據上次快照,但由於您的應用程序可以與內存數據配合使用,因此應該可以提高整體性能。

0

此外,你必須以線程安全的方式實現單例模式。我認爲最好的方法是使用內部類來保證多線程應用程序中單例的目的。