2013-10-22 65 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

感謝您的迴應和您的想法 - 我將在更新應用程序後進行更新。 –