java中使用多線程不能明顯提升程序效率的一些緣由.

java中使用多線程不能明顯提升程序效率的一些緣由.

使用多個線程來處理多任務的時候,效率確定是有提升的.可是必需要慎用,不然容易出現問題.

1.多線程主要是爲了充分利用多核cpu,大內存這些資源.
若是你的硬件跟不上,只有一個cpu,那麼多線程從併發變成了串行了,另外再加上線程上下文切換的時候,那你就得不償失了.
2.原子問題
若是多線程是同步操做一個原子數據,(多個線程同步去處理一個加鎖的對象),那效率確定不會提高,就好像1我的去作1件事和多我的排隊去作一件事效率是同樣的;

3.線程的個數對於一個應用程序來說的話,每每會有一個臨界值。
  臨界資源的訪問問題,程序中臨界區的指令通常來講越少越好,最好不要在臨界區中作一些重量級的事情,例如說數據庫,寫文件,讀文件!

4.對硬盤的讀寫有特殊的地方。
對磁盤進行多線程處理的時候,效率會急速降低!!
由於不一樣文件的讀寫,會形成磁頭的頻繁轉換,磁頭的頻繁轉換要比讀取磁盤的時間更長。
因此這種狀況下,最好有個線程去讀取文件,其餘的線程去處理文件數據中的業務邏輯處理.

5.操做系統的IO通道數量的影響
採用普通的File文件API來讀寫多文件.使用多線程的話很大程度上也不會提升效率.
由於文件,網絡等流的讀寫都須要操做IO通道,而操做系統的IO通道數量是固定的。
咱們假設你的電腦只有一個IO通道,若是你打開一個文件流並進行讀寫,則佔用了一個IO通道,若是你又打開一個文件流,則第二個文件流須要等待第一個文件關閉通道才能真正意義上的進行讀寫。 因此實際上,你打開多個文件同時進行讀寫時就是在串行單線程操做。

解決的辦法是採用 NIO: java.nio (Java 2 Platform SE v1.4.2)
NIO的意思固然就是同時開啓N個IO通道了,若是你的機器硬件的確只支持同時打開一個通道的話,Java虛擬器會幫你作虛擬協調NIO比普通IO技術至少快30%.
具體能夠查看JAVA文件NIO的文檔.

普通方式寫文件先獲得FileOutputStream,而後直接設用 os.write(bytes);
而如今不一樣點在於先獲得一個Channel再建構一個Bytebuffer,再用二者完成任務,java虛擬機幫你完成剩下的CPU和IO任務調度.
其實這個方式也就是異步的樣子了,實際裏不少前端MVC框架如JSF的實現primefaces,已經封裝了,也無法用.若是要用的話也是用Apache NIO 框架 Mina.
相關文章
相關標籤/搜索