❶ java開發 怎麼控制 每秒並發數
java.util.concurrent.Executors里有很多方戚逗法高或賣創建固定個數的線程池
還有團悔java.util.concurrent.ThreadPoolExecutor等
// 構造一個線程池
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 10, 3,
TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(3),
new ThreadPoolExecutor.DiscardOldestPolicy());
❷ java程序員面試時被問到:如何在j2ee項目中處理高並發量訪問 該怎麼回答 請仔細看題干再回答
一般需從三點入手。
一、程序本身支持高並發。
簡單來說就是要優化我們的代碼。
1、避免使用錯誤的方式,盡量不用instanceof做條件判斷,不要將數組聲明為:public static final 。
2、使用java中效率高的類,比如盡量使用HashMap 和ArrayList ,除非必要,否則不推薦使用HashTable和Vector ,後者由於使用同步機制,而導致了性能的開銷。
3、盡量指定類的final修飾符 帶有final修飾符的類是不可派生的。在Java核心API中,有許多應用final的例子,例如java.lang.String。為String類指定final防止了人們覆蓋length()方法。另外,如果指定一個類為final,則該類所有的方法都是final。Java編譯器會尋找機會內聯(inline)所有的final方法(這和具體的編譯器實現有關)。此舉能夠使性能平均提高50% 。
4、盡量重用對象,避免頻繁的使用new對象。對於整個應用只需要存在一個實例的類,我們可以使用單例模式。對於工具類可以使用靜態方法的方式訪問。
用new關鍵詞創建類的實例時,構造函數鏈中的所有構造函數都會被自動調用。但如果一個對象實現了Cloneable介面,我們可以調用它的clone()方法。clone()方法不會調用任何類構造函數。
在使用設計模式(Design Pattern)的場合,如果用Factory模式創建對象,則改用clone()方法創建新的對象實
例非常簡單。例如,
Java代碼收藏代碼
下面是Factory模式的一個典型實現:
(){
returnnewCredit();
}
改進後的代碼使用clone()方法,如下所示:
privatestaticCreditBaseCredit=newCredit();
(){
return(Credit)BaseCredit.clone();
}
上面的思路對於數組處理同樣很有用。
5、特別是String 對象的使用中,出現字元串連接情況時應用StringBuffer 代替。由於系統不僅要花時間生成對象,以後可能還需花時間對這些對象進行垃圾回收和處理。因此,生成過多的對象將會給程序的性能帶來很大的影響。
6、StringBuffer 的使用:StringBuffer表示了可變的、可寫的字元串。
它有三個構造方法 :
StringBuffer();//默認分配16個字元的空間
StringBuffer(intsize);//分配size個字元的空間
StringBuffer(Stringstr);//分配16個字元+str.length()個字元空間
你可以通過StringBuffer的構造函數來設定它的初始化容量,這樣可以明顯地提升性能。這里提到的構造函數是StringBuffer(int length),length參數表示當前的StringBuffer能保持的字元數量。你也可以使用ensureCapacity(int minimumcapacity)方法在StringBuffer對象創建之後設置它的容量。首先我們看看StringBuffer的預設行為,然 後再找出一條更好的提升性能的途徑。
StringBuffer在內部維護一個字元數組,當你使用預設的構造函數來創建StringBuffer對象的時候,因為沒有設置初始化字元長度,StringBuffer的容量被初始化為16個字元,也就是說預設容量就是16個字元。當StringBuffer達到最大容量 的時候,它會將自身容量增加到當前的2倍再加2,也就是(2*舊值+2)。如果你使用預設值,初始化之後接著往裡面追 加字元,在你追加到第16個字元的時候它會將容量增加到34(2*16+2),當追加到34個字元的時候就會將容量增加到 70(2*34+2)。無論何事只要StringBuffer到達它的最大容量它就不得不創建一個新的字元數組然後重新將舊字元和 新字元都拷貝一遍――這也太昂貴了點。所以總是給StringBuffer設置一個合理的初始化容量值是錯不了的,這樣會帶來 立竿見影的性能增益。
StringBuffer初始化過程的調整的作用由此可見一斑。所以,使用一個合適的容量值來初始化StringBuffer永遠都是一個最佳的建議。
7、盡量使用局部變數,調用方法時傳遞的參數以及在調用中創建的臨時變數都保存在棧(Stack)中,速度較快。其他變數,如靜態變數、實例變數等,都在堆(Heap)中創建,速度較慢。另外,依賴於具體的編譯器/JVM,局部變數還可能得到進一步優化。請參見《盡可能使用堆棧變數》。
8、不要重復初始化變數 默認情況下,調用類的構造函數時, Java會把變數初始化成確定的值:所有的對象被設置成null,整數變數(byte、short、int、long)設置成0,float和double變數設置成0.0,邏輯值設置成false。當一個類從另一個類派生時,這一點尤其應該注意,因為用new關鍵詞創建一個對象時,構造函數鏈中的所有構造函數都會被自動調用。
9、在JAVA + ORACLE 的應用系統開發中,java中內嵌的SQL語句盡量使用大寫的形式,以減輕ORACLE解析器的解析負擔。
10、Java 編程過程中,進行資料庫連接、I/O流操作時務必小心,在使用完畢後,即使關閉以釋放資源。因為對這些大對象的操作會造成系統大的開銷,稍有不慎,會導致嚴重的後果。
11、由於JVM的有其自身的GC機制,不需要程序開發者的過多考慮,從一定程度上減輕了開發者負擔,但同時也遺漏了隱患,過分的創建對象會消耗系統的大量內存,嚴重時會導致內存泄露,因此,保證過期對象的及時回收具有重要意義。JVM回收垃圾的條件是:對象不在被引用;然而,JVM的GC並非十分的機智,即使對象滿足了垃圾回收的條件也不一定會被立即回收。所以,建議我們在對象使用完畢,應手動置成null。
12、在使用同步機制時,應盡量使用方法同步代替代碼塊同步。
13、盡量減少對變數的重復計算
例如:
for(inti=0;i<list.size;i++){
…
}
應替換為:
for(inti=0,intlen=list.size();i<len;i++){
…
}
14、盡量採用lazy loading 的策略,即在需要的時候才開始創建。
例如:
Stringstr=「aaa」;
if(i==1){
list.add(str);
}
應替換為:
if(i==1){
Stringstr=「aaa」;
list.add(str);
}
15、慎用異常
異常對性能不利。拋出異常首先要創建一個新的對象。Throwable介面的構造函數調用名為fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法檢查堆棧,收集調用跟蹤信息。只要有異常被拋出,VM就必須調整調用堆棧,因為在處理過程中創建了一個新的對象。 異常只能用於錯誤處理,不應該用來控製程序流程。
16、不要在循環中使用try...catch,應把其放置在最外層。
17、合理的使用Java類 java.util.Vector。
簡單地說,一個Vector就是一個java.lang.Object實例的數組。Vector與數組相似,它的元素可以通過整數形式的索引訪問。但是,Vector類型的對象在創建之後,對象的大小能夠根據元素的增加或者刪除而擴展、縮小。請考慮下面這個向Vector加入元素的例子:
Java代碼收藏代碼
Objectobj=newObject();
Vectorv=newVector(100000);
for(intI=0;
I<100000;I++){v.add(0,obj);}
❸ java中如何限制並發數量
常見的脊陸做法是建立線程池,如果線程池滿了就禁止新的連接。
線程池可以看作一個令牌庫。如果要運行,就需要獲取一個令牌,運行完畢退頌神回令牌。如果令牌發光野野虧了,就禁止新的運行,等待退回的令牌。
❹ 項目中怎麼控制多線程高並發訪問
1、首先明確信號量Semaphore的用法,然後新建一個項目,new-->file-->class,隨意命名,此處命名為semaphoreDemo。
❺ Java如何控制方法的調用次數
Java控制方法的調用次數,可以使用static變數來統計局芹次數,當達到規定的次數,拋出異常,實例如下:
staticinti=0;
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
//磨斗TODOAuto-generatedmethodstub
//循環調用count計數
for(inti=0;i<5;i++){
count();
if(static>10){//當方法調桐游畢用次數達到這個次數,就終止主程序
return;
}
}
}
/**
*計數
*/
publicstaticvoidcount(){
i++;
System.out.println("第"+i+"次調用count方法");
}
❻ JAVA中高訪問量高並發的問題怎麼解決
你指的高並發量大概有多少?
幾點需要注意:
盡量使用緩存,包括用戶緩存,信息緩存等,多花點內存來做緩存,可以大量減少與資料庫的交互,提高性能。
用jprofiler等工具找出性能瓶頸,減少額外的開銷。
優化資料庫查詢語句,減少直接使用hibernate等工具的直接生成語句(僅耗時較長的查詢做優化)。
優化資料庫結構,多做索引,提高查詢效率。
統計的功能盡量做緩存,或按每天一統計或定時統計相關報表,避免需要時進行統計的功能。
能使用靜態頁面的地方盡量使用,減少容器的解析(盡量將動態內容生成靜態html來顯示)。
解決以上問題後,使用伺服器集群來解決單台的瓶頸問題。
基本上以上述問題解決後,達到系統最優。
至於樓上有人提到別用JAVA來做,除非是低層的連接數過大(如大量的埠佔用需求),這種情況下考慮直接C來寫,其他的可以用JAVA來做。
❼ java 怎樣處理高並發
一、背景綜述
並發就是可以使用多個線程或進程,同時處理(就是並發)不同的操作。
高並發的時候就是有很多用戶在訪問,導致系統數據不正確、糗事數據的現象。對於一些大型網站,比如門戶網站,在面對大量用戶訪問、高並發請求方面,基本的解決方案集中在這樣幾個環節:使用高性能的伺服器、高性能的資料庫、高效率的編程語言、還有高性能的Web容器。這幾個解決思路在一定程度上意味著更大的投入。
使用一般的synchronized或者是lock或者是隊列都是無法滿足高並發的問題。
二、解決方法有三:
1.使用緩存
2.使用生成靜態頁面
html純靜態頁面是效率最高、消耗最小的頁面。我們可以使用信息發布系統來實現簡單的信息錄入自動生成靜態頁面,頻道管理、許可權管理和自動抓取等功能,對於一個大型網站來說,擁有一套高效、可管理的信息發布系統CMS是必不可少的。
3.圖片伺服器分離
圖片是最消耗資源的,僵圖片和頁面分離可以降低提供頁面訪問請求的伺服器系統壓力,並且可以保證系統不會因為圖片問題而崩潰。
3.寫代碼的時候減少不必要的資源浪費:
不要頻繁得使用new對象,對於在整個應用中只需要存在一個實例的類使用單例模式.對於String的連接操作,使用StringBuffer或者StringBuilder.對於utility類型的類通過靜態方法來訪問。
避免使用錯誤的方式,如Exception可以控制方法推出,但是Exception要保留stacktrace消耗性能,除非必要不要使用 instanceof做條件判斷,盡量使用比的條件判斷方式.使用JAVA中效率高的類,比如ArrayList比Vector性能好。)
使用線程安全的集合對象vector hashtable
使用線程池