我正在修改现有的java多线程应用程序。在每个线程中,应用程序通过同步方法调用检索输出流对象(我考虑用enum或readwritelock替换)。一旦线程获得了引用,它就会在将byteArrayOutputStream传递给它之前再次在输出流上进行同步以进行写入。关于我如何才能优化它的任何想法 - 如果负载稍高,我确实看到一些线程处于监视器状态(增加线程数不是我考虑的事情)。任何有用的建议都会非常受欢迎。
答案 0 :(得分:4)
在每个线程中,应用程序通过同步方法调用检索输出流对象(我想用enum或readwritelock替换)。
这似乎是合理的。每个线程彼此阻塞只是为了获得适当的输出流。如果可以在地图中完成从thread-info到ConcurrentHashMap
的映射,则可以使用OutputStream
替换它。
一旦线程获得了引用,它就会再次在输出流上同步,然后再将byteArrayOutputStream传递给它以便写出来。
一旦它具有适当的OutputStream
,它就锁定它以保证对流的唯一访问。您可能希望确保流下面的内容尚未同步(通常不是这种情况),否则这似乎是合理的。
关于我如何才能优化它的任何想法
在同步成本产生影响之前,您的程序最有可能是IO绑定 long 。除非探查器告诉您同步存在性能问题,否则我会将优化工作集中在其他地方。
答案 1 :(得分:1)
据我所知,这里有两个同步调用:
后者基本上调用outputstream.write,你不应该同时从不同的线程做,所以没有办法避免第二个。
首先,根据您提供的信息,无法说出是否有必要花时间去摆脱同步,甚至是否有必要。用读写锁替换它是有道理的 - 除非基本上每个人都在写。相反,如果只有读者,你可以(可能)完全摆脱锁定。