在java中多次同步同一个引用

时间:2013-10-22 19:06:10

标签: java multithreading

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

2 个答案:

答案 0 :(得分:4)

  

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

这似乎是合理的。每个线程彼此阻塞只是为了获得适当的输出流。如果可以在地图中完成从thread-info到ConcurrentHashMap的映射,则可以使用OutputStream替换它。

  

一旦线程获得了引用,它就会再次在输出流上同步,然后再将byteArrayOutputStream传递给它以便写出来。

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

  

关于我如何才能优化它的任何想法

在同步成本产生影响之前,您的程序最有可能是IO绑定 long 。除非探查器告诉您同步存在性能问题,否则我会将优化工作集中在其他地方。

答案 1 :(得分:1)

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

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

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

首先,根据您提供的信息,无法说出是否有必要花时间去摆脱同步,甚至是否有必要。用读写锁替换它是有道理的 - 除非基本上每个人都在写。相反,如果只有读者,你可以(可能)完全摆脱锁定。