java控制並發
『壹』 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中如何限制並發數量
常見的做法是建立線程池,如果線程池滿了就禁止新的連接。
線程池可以看作一個令牌庫。如果要運行,就需要獲取一個令牌,運行完畢退回令牌。如果令牌發光了,就禁止新的運行,等待退回的令牌。
『叄』 java防止並發的幾種方法
使用synchronized關鍵字3種使用方法:
修飾類方法,作用於當前實例加鎖,進入方法要獲取當前實例的鎖
修飾靜態方法,作用於當前實例加鎖,進入方法要獲取當前實例的鎖
修飾代碼塊,指定加鎖對象,給指定對象加鎖,進入代碼塊要先獲取指定對象的鎖(synchronized參數要傳入固定的對象才能起到作用)
使用原子操作:
java 在 SDK atomic包下的提供了原子操作的類,常用的有
AtomicBoolean
AtomicInteger
AtomicIntegerArray
AtomicIntegerFieldUpdater
AtomicLong
AtomicLongArray
AtomicLongfieldUpdater
AtomicMarkableReference
AtomicReference
AtomicReference
AtomicReferenceArray
AtomicReferenceFieldUpdater
AtomicStampedReference
DoubleAccumulator
DoubleAdder
LongAccumulator
LongAdder
Striped64
其中atomicboolean atomicinteger atomicreperence常用的方法及含義
get() 獲取當前值
set()設置當前值
getAndSet(V newValue) 獲取當前值並設置最新的值
compareAndSer(V expect,V update)如果expect與當前值相同就設置update為最新值
『肆』 java中怎麼實現高並發
對於並發操作,都要上鎖的,設置一個欄位記錄抽到獎的人數,每抽到一個就讓update該欄位值+1,更新過程中資料庫會自動給資料庫上鎖,直到commit提交,這里就避免了你說的同時查詢的問題。
『伍』 java如何處理高並發
你指的高並發量大概有多少?x0dx0a幾點需要注意:x0dx0a盡量使用緩存,包括用戶緩存,信息緩存等,多花點內存來做緩存,可以大量減少與資料庫的交互,提高性能。x0dx0a用jprofiler等工具找出性能瓶頸,減少額外的開銷。x0dx0a優化資料庫查詢語句,減少直接使用hibernate等工具的直接生成語句(僅耗時較長的查詢做優化)。x0dx0a優化資料庫結構,多做索引,提高查詢效率。x0dx0a統計的功能盡量做緩存,或按每天一統計或定時統計相關報表,避免需要時進行統計的功能。x0dx0ax0dx0a能使用靜態頁面的地方盡量使用,減少容器的解析(盡量將動態內容生成靜態html來顯示)。x0dx0a解決以上問題後,使用伺服器集群來解決單台的瓶頸問題。x0dx0a基本上以上述問題解決後,達到系統最優。x0dx0ax0dx0a至於樓上有人提到別用JAVA來做,除非是低層的連接數過大(如大量的埠佔用需求),這種情況下考慮直接C來寫,其他的可以用JAVA來做。x0dx0ax0dx0a可以網上購買視頻做教育學習。
『陸』 java如何創建一個定長線程池,可控制線程最大並發數,超出的線程會在隊列中等待。求代碼
packagetest;
importjava.util.concurrent.ExecutorService;
importjava.util.concurrent.Executors;
{
publicstaticvoidmain(String[]args){
=Executors.newFixedThreadPool(3);
for(inti=0;i<10;i++){
finalintindex=i;
fixedThreadPool.execute(newRunnable(){
publicvoidrun(){
try{
System.out.println(index);
Thread.sleep(2000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
});
}
}
}
因為線程池大小為3,每個任務輸出index後sleep 2秒,所以每兩秒列印3個數字。
定長線程池的大小最好根據系統資源進行設置。如Runtime.getRuntime().availableProcessors()