【发布时间】:2013-05-28 18:09:30
【问题描述】:
我想就此提出意见以解决一个小纠纷。任何帮助将不胜感激。
我已经编写了自己的文件处理程序,该处理程序附加到记录器。这是一个文件处理程序并被多个线程访问,我使用同步以确保在写入过程中没有冲突。另外它是一个滚动日志,所以我也关闭和打开文件,也不希望出现任何问题。
他的回复是(从电子邮件中粘贴)
我坚信 Handler 中的同步非常糟糕。它 对于这样简单的任务来说太复杂了。所以,我会说为什么不使用一个 每个线程的实例?
从性能和内存管理的角度来看,您会说什么更好。 非常感谢您的任何回复。每当在多线程应用程序中涉及到读写时,我一生都在 java 应用程序上使用同步,没有听说过任何严重的性能问题。
所以我想知道是否有任何问题,我真的应该每个线程切换到一个实例。
一般来说,使用同步的缺点是什么?
编辑:我编写自定义文件处理程序的原因(是的,我确实喜欢 slf4j),因为我的自定义处理程序同时处理两个文件,此外,除了写入文件之外,我还执行了一些其他功能.
【问题讨论】:
-
理论讨论很好(理论上(原文如此))。但是要定量地回答这个问题,您必须测试 性能(您可以使用caliper 来解决这个问题)。同步确实具有性能影响 - 这有多严重取决于线程之间对受保护资源的争用。我不明白“每个线程一个实例”,这是否意味着每个处理程序有一个单独的文件?
-
当 log4j、slf4j 和 apache commons logging 都存在时,你为什么要这样做?记录没有解决吗?你为什么要浪费你的时间试图改进已经做了很多次的事情?
-
我怀疑任何应用程序都会在日志记录上花费大量运行时间——因此性能可能不值得考虑,而不仅仅是拥有一个可靠的解决方案。我非常怀疑这是一个瓶颈。
-
@earcam 我猜他的意思是为每个线程创建一个处理程序,这样他们就不会干扰。他的解释还在来,但我也不是引用理解它。
-
@Pescis 日志实际上经常是现实生活中的性能威胁,但它也可以通过日志级别过滤器进行系统控制。
标签: java multithreading synchronization locking readwritelock