0

我正在修改现有的 java 多线程应用程序。在每个线程中,应用程序通过同步方法调用(我正在考虑用 enum 或 readwritelock 替换)检索输出流对象。一旦线程获得了引用,它就会再次在输出流上进行同步,然后再将 byteArrayOutputStream 传递给它以进行写出)。关于如何优化它的任何想法 - 当负载略高时,我确实看到一些线程处于监视器状态(增加线程数不是我正在考虑的事情)。任何有用的建议都将受到欢迎。

4

2 回答 2

4

在每个线程中,应用程序通过同步方法调用(我正在考虑用 enum 或 readwritelock 替换)检索输出流对象。

这似乎是合理的。每个线程相互阻塞只是为了获得适当的输出流。ConcurrentHashMap如果从 thread-info 到的映射可以在映射中完成,您可以将其替换为OutputStreama。

一旦线程获得了引用,它就会继续在输出流上再次同步,然后将 byteArrayOutputStream 传递给它以进行写出)

一旦它有适当的OutputStream,它就会锁定它以保证对流的唯一访问。您可能希望确保流下方的内容尚未同步(通常不是这种情况),否则这似乎是合理的。

关于如何优化它的任何想法(如果有的话)

在同步成本产生影响之前,的程序很可能会受到 IO 限制。除非分析器告诉您同步存在性能问题,否则我会将您的优化工作集中在其他地方。

于 2013-10-22T19:15:30.303 回答
1

据我所见,这里有两个同步调用:

  • 获取输出流的调用(在某个对象上同步)
  • 对 ByteArrayOutputStream.writeTo 的调用(在某些输出流上同步)

后者基本上调用 outputstream.write 你不应该同时从不同的线程执行,所以没有办法避免第二个。

至于第一个,根据您提供的信息,无法说花时间摆脱同步是否有意义,甚至是否有必要。用读写锁替换它是有意义的——除非基本上每个人都在写。相反,如果只有读者,您可以(可能)完全摆脱锁。

于 2013-10-22T19:22:13.510 回答