我正在修改现有的 java 多线程应用程序。在每个线程中,应用程序通过同步方法调用(我正在考虑用 enum 或 readwritelock 替换)检索输出流对象。一旦线程获得了引用,它就会再次在输出流上进行同步,然后再将 byteArrayOutputStream 传递给它以进行写出)。关于如何优化它的任何想法 - 当负载略高时,我确实看到一些线程处于监视器状态(增加线程数不是我正在考虑的事情)。任何有用的建议都将受到欢迎。
问问题
82 次
2 回答
4
在每个线程中,应用程序通过同步方法调用(我正在考虑用 enum 或 readwritelock 替换)检索输出流对象。
这似乎是合理的。每个线程相互阻塞只是为了获得适当的输出流。ConcurrentHashMap
如果从 thread-info 到的映射可以在映射中完成,您可以将其替换为OutputStream
a。
一旦线程获得了引用,它就会继续在输出流上再次同步,然后将 byteArrayOutputStream 传递给它以进行写出)
一旦它有适当的OutputStream
,它就会锁定它以保证对流的唯一访问。您可能希望确保流下方的内容尚未同步(通常不是这种情况),否则这似乎是合理的。
关于如何优化它的任何想法(如果有的话)
在同步成本产生影响之前,您的程序很可能会受到 IO 限制。除非分析器告诉您同步存在性能问题,否则我会将您的优化工作集中在其他地方。
于 2013-10-22T19:15:30.303 回答
1
据我所见,这里有两个同步调用:
- 获取输出流的调用(在某个对象上同步)
- 对 ByteArrayOutputStream.writeTo 的调用(在某些输出流上同步)
后者基本上调用 outputstream.write 你不应该同时从不同的线程执行,所以没有办法避免第二个。
至于第一个,根据您提供的信息,无法说花时间摆脱同步是否有意义,甚至是否有必要。用读写锁替换它是有意义的——除非基本上每个人都在写。相反,如果只有读者,您可以(可能)完全摆脱锁。
于 2013-10-22T19:22:13.510 回答