2013-10-22 28 views
0

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

+0

某些代码会很有用 – mishadoff

+0

您的意思是将流传递给byteArrayOutputStream.writeOut? – subsub

回答

4

在每个线程中,应用程序通过同步方法调用(我想用enum或readwritelock替换)检索outputstream对象。

这似乎是合理的。每个线程相互阻塞只是为了获得适当的输出流。如果可以在地图中完成从线索信息到OutputStream的映射,您可能可以用ConcurrentHashMap替换它。

一旦该线程已获取的基准,它然后前进到上OutputStream的传递一个ByteArrayOutputStream到它用于写出)

一旦它具有适当的OutputStream它锁定在它之前再次同步保证对流的唯一访问权限。您可能需要确保流下方的内容尚未同步(通常不是这种情况),否则这看起来很合理。

我如何能去优化它,如果在所有

你的程序是最有可能会成为IO同步的成本约束之前长期任何想法有差别。除非分析人员告诉你同步存在性能问题,否则我会将您的优化工作集中在其他地方。

+0

感谢您的回应和您的想法 - 我将在更新应用程序后进行更新。 –

1

至于我可以看到这里有两个同步呼叫:

  • 调用获得一个OutputStream(同步的一些对象)
  • 调用ByteArrayOutputStream.writeTo(同步的一些OutputStream中)

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

至于第一个,根据您提供的信息,不可能说是投入时间来摆脱同步,或者甚至是否有必要。用读写锁代替它可能是有道理的 - 除非基本上每个人都在写。相反,如果只有读者可以(可能)完全摆脱锁定。

+0

感谢您的回应和您的想法 - 我将在更新应用程序后进行更新。 –