Multithreading 多线程环境中的单线程

Multithreading 多线程环境中的单线程,multithreading,logging,design-patterns,singleton,Multithreading,Logging,Design Patterns,Singleton,我有一个名为FILELOGGER的单例类和一个名为numberofline的属性。 我将确保只有一个对象能够为创建singleton的FILELOGGER类创建 在我的整个应用程序中,我的对象能够将其写入文件,并为每次写入更新行数属性 如果我在多线程环境中使用此设计模式会怎么样。当其他线程尝试更新时,应该锁定它的行为方式以及我感觉的number\u of\u line属性。我可能会延迟记录数据,性能也会下降 例如,假设线程T1在时间10:10:10进行日志记录,T2也在相同的精确时间进行日志记录

我有一个名为
FILELOGGER
的单例类和一个名为numberofline的属性。 我将确保只有一个对象能够为创建singleton的
FILELOGGER
类创建

在我的整个应用程序中,我的对象能够将其写入文件,并为每次写入更新
行数
属性

如果我在多线程环境中使用此设计模式会怎么样。当其他线程尝试更新时,应该锁定它的行为方式以及我感觉的
number\u of\u line
属性。我可能会延迟记录数据,性能也会下降

例如,假设线程
T1
在时间10:10:10进行日志记录,
T2
也在相同的精确时间进行日志记录,并且两者都试图更新
行数
属性


如何解决这个问题?是否有其他设计模式可以解决此问题。谢谢你抽出时间

您可以像已经做的那样同步对整个文件的访问,或者还有一个缺点:快照

  • N个线程将文件内容写入
    字符串
    变量
  • 专用线程将内存中的数据快照到磁盘,并更新
    行数
    <代码>行数
    将在该专用线程需要更新时同步。快照可能以10秒、1分钟、1小时等时间间隔进行

这种方法的主要问题是,应用程序/系统崩溃将意味着丢失自上次快照以来未保存到磁盘上的数据,但由于应用程序使用内存中的数据,因此应能提高总体性能。

您可以像以前一样同步对整个文件的访问,或者还有另一个缺点:快照

  • N个线程将文件内容写入
    字符串
    变量
  • 专用线程将内存中的数据快照到磁盘,并更新
    行数
    <代码>行数
    将在该专用线程需要更新时同步。快照可能以10秒、1分钟、1小时等时间间隔进行

这种方法的主要问题是,应用程序/系统崩溃将意味着丢失自上次快照以来未持久保存到磁盘的数据,但由于应用程序使用内存中的数据,因此应该提高总体性能。

此外,您还必须以线程安全的方式实现单例模式。我认为最好的方法是使用一个内部类来保证多线程应用程序中单例的用途。

此外,还必须以线程安全的方式实现单例模式。我认为最好的方法是使用一个内部类来保证单例在多线程应用程序中的用途。

“当其他线程尝试更新时,它的行为和我感觉应该锁定number\u of \u lines属性。我可能会延迟数据的日志记录,而性能将下降。”还不知道你在这里是什么意思。但我认为您必须同时锁定
writeToFile
函数(否则您的文件将被弄乱)和字段
number\u行
,以使值原子化。是的。如果我同时锁定了writeToFile和字段编号\u的\u行。我将以性能下降结束,因为其他写操作将在队列中等待,并且无法在准确的时间登录。好的,我将为您提供2个解决方案:1。在消息中包含时间。2.写入多个文件。(失去而不是失去顺便说一句)我认为这是一个糟糕的方法,为每个线程写入多个文件,然后运行一个算法来合并这些文件。那会很混乱。你到底想要什么:让变量保持一致的状态?能够确定哪个事件发生在另一个事件之前?缓解性能瓶颈?“它的行为如何,我觉得当其他线程尝试更新时,应该锁定“行数”属性。我可能会延迟记录数据,性能将下降。”还不确定您在这里的意思。但我认为您必须同时锁定
writeToFile
函数(否则您的文件将被弄乱)和字段
number\u行
,以使值原子化。是的。如果我同时锁定了writeToFile和字段编号\u的\u行。我将以性能下降结束,因为其他写操作将在队列中等待,并且无法在准确的时间登录。好的,我将为您提供2个解决方案:1。在消息中包含时间。2.写入多个文件。(失去而不是失去顺便说一句)我认为这是一个糟糕的方法,为每个线程写入多个文件,然后运行一个算法来合并这些文件。那会很混乱。你到底想要什么:让变量保持一致的状态?能够确定哪个事件发生在另一个事件之前?缓解性能瓶颈?