java並發控制
① java中如何限制並發數量
常見的做法是建立線程池,如果線程池滿了就禁止新的連接。
線程池可以看作一個令牌庫。如果要運行,就需要獲取一個令牌,運行完畢退回令牌。如果令牌發光了,就禁止新的運行,等待退回的令牌。
② java高並發,如何解決,什麼方式解決,高並發
首先,為防止高並發帶來的系統壓力,或者高並發帶來的系統處理異常,數據紊亂,可以以下幾方面考慮:1、加鎖,這里的加鎖不是指加java的多線程的鎖,是指加應用所和資料庫鎖,應用鎖這邊通常是使用redis的setnx來做,其次加資料庫鎖,因為代碼中加了應用所,所以資料庫不建議加悲觀鎖(排他鎖),一般加樂觀鎖(通過設置一個seq_no來解決),這兩個鎖一般能解決了,最後做合理的流控,丟棄一部分請求也是必不可少的
③ java 怎樣處理高並發
一、背景綜述
並發就是可以使用多個線程或進程,同時處理(就是並發)不同的操作。
高並發的時候就是有很多用戶在訪問,導致系統數據不正確、糗事數據的現象。對於一些大型網站,比如門戶網站,在面對大量用戶訪問、高並發請求方面,基本的解決方案集中在這樣幾個環節:使用高性能的伺服器、高性能的資料庫、高效率的編程語言、還有高性能的Web容器。這幾個解決思路在一定程度上意味著更大的投入。
使用一般的synchronized或者是lock或者是隊列都是無法滿足高並發的問題。
二、解決方法有三:
1.使用緩存
2.使用生成靜態頁面
html純靜態頁面是效率最高、消耗最小的頁面。我們可以使用信息發布系統來實現簡單的信息錄入自動生成靜態頁面,頻道管理、許可權管理和自動抓取等功能,對於一個大型網站來說,擁有一套高效、可管理的信息發布系統CMS是必不可少的。
3.圖片伺服器分離
圖片是最消耗資源的,僵圖片和頁面分離可以降低提供頁面訪問請求的伺服器系統壓力,並且可以保證系統不會因為圖片問題而崩潰。
3.寫代碼的時候減少不必要的資源浪費:
不要頻繁得使用new對象,對於在整個應用中只需要存在一個實例的類使用單例模式.對於String的連接操作,使用StringBuffer或者StringBuilder.對於utility類型的類通過靜態方法來訪問。
避免使用錯誤的方式,如Exception可以控制方法推出,但是Exception要保留stacktrace消耗性能,除非必要不要使用 instanceof做條件判斷,盡量使用比的條件判斷方式.使用JAVA中效率高的類,比如ArrayList比Vector性能好。)
使用線程安全的集合對象vector hashtable
使用線程池
④ 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 多進程並發控制怎麼做
進程間的通訊無非就是讀寫文件,socket通訊或者使用共享內存。 你不想用讀寫文件的方式,那就用共享內存或者socket通訊的方式。我個人覺得用socket比較簡單,也許是因為我對socket比較熟悉。 下面是一篇java實現共享內存的文章,java沒法管理內存,其實他也是靠創建映像文件來實現的。 共享內存在java中的實現 在jdk1.4中提供的類MappedByteBuffer為我們實現共享內存提供了較好的方法。該緩沖區實際上是一個磁碟文件的內存映像。二者的變化將保持同步,即內存數據發生變化會立刻反映到磁碟文件中,這樣會有效的保證共享內存的實現。 將共享內存和磁碟文件建立聯系的是文件通道類:FileChannel。該類的加入是JDK為了統一對外部設備(文件、網路介面等)的訪問方法,並且加強了多線程對同一文件進行存取的安全性。例如讀寫操作統一成read和write。這里只是用它來建立共享內存用,它建立了共享內存和磁碟文件之間的一個通道。 打開一個文件建立一個文件通道可以用RandomAccessFile類中的方法getChannel。該方法將直接返回一個文件通道。該文件通道由於對應的文件設為隨機存取文件,一方面可以進行讀寫兩種操作,另一方面使用它不會破壞映像文件的內容(如果用FileOutputStream直接打開一個映像文件會將該文件的大小置為0,當然數據會全部丟失)。這里,如果用 FileOutputStream和FileInputStream則不能理想的實現共享內存的要求,因為這兩個類同時實現自由的讀寫操作要困難得多。 下面的代碼實現了如上功能,它的作用類似UNIX系統中的mmap函數。 // 獲得一個只讀的隨機存取文件對象 RandomAccessFile RAFile = new RandomAccessFile(filename,"r"); // 獲得相應的文件通道 FileChannel fc = RAFile.getChannel(); // 取得文件的實際大小,以便映像到共享內存 int size = (int)fc.size(); // 獲得共享內存緩沖區,該共享內存只讀 MappedByteBuffer mapBuf = fc.map(FileChannel.MAP_RO,0,size); // 獲得一個可讀寫的隨機存取文件對象 RAFile = new RandomAccessFile(filename,"rw"); // 獲得相應的文件通道 fc = RAFile.getChannel(); // 取得文件的實際大小,以便映像到共享內存 size = (int)fc.size(); // 獲得共享內存緩沖區,該共享內存可讀寫 mapBuf = fc.map(FileChannel.MAP_RW,0,size); // 獲取頭部消息:存取許可權 mode = mapBuf.getInt(); 如果多個應用映像同一文件名的共享內存,則意味著這多個應用共享了同一內存數據。這些應用對於文件可以具有同等存取許可權,一個應用對數據的刷新會更新到多個應用中。 為了防止多個應用同時對共享內存進行寫操作,可以在該共享內存的頭部信息加入寫操作標志。該共享內存的頭部基本信息至少有: int Length; // 共享內存的長度。 int mode; // 該共享內存目前的存取模式。 共享內存的頭部信息是類的私有信息,在多個應用可以對同一共享內存執行寫操作時,開始執行寫操作和結束寫操作時,需調用如下方法: public boolean StartWrite() { if(mode == 0) { // 標志為0,則表示可寫 mode = 1; // 置標志為1,意味著別的應用不可寫該共享內存 mapBuf.flip(); mapBuf.putInt(mode); // 寫如共享內存的頭部信息 return true; } else { return false; // 指明已經有應用在寫該共享內存,本應用不可寫該共享內存 } } public boolean StopWrite() { mode = 0; // 釋放寫許可權 mapBuf.flip(); mapBuf.putInt(mode);
⑦ 如何控制java線程並發數
這個和線程池相關 詳見
ThreadPoolExecutor
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory)execute(Runnable command) 在將來某個時間執行給定任務。
給出構造方法,和 執行函數
構造方法里的poolsize可以體會到吧
⑧ java 線程同步並發怎麼控制
synchronized 方法
通過在方法聲明中加入 synchronized關鍵字來聲明 synchronized 方法。如:
public synchronized void getResult();
synchronized方法控制對類成員變數的訪問。它是如何來避免類成員變數的訪問控制呢?我們知道方法使用了synchronized關鍵字表明該方法已加鎖,在任一線程在訪問改方法時都必須要判斷該方法是否有其他線程在「獨占」。每個類實例對應一個把鎖,每個synchronized方法都必須調用該方法的類實例的鎖方能執行,否則所屬線程阻塞,方法一旦執行,就獨占該鎖,直到從該方法返回時才將鎖釋放,被阻塞的線程方能獲得該鎖。
⑨ 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中什麼是並發,如何解決
是多線程,多個線程並發執行
處理方法:創建線程對象,創建啟動線程方法(start),等main方法線程結束後,自動調用start執行並處理線程體中內容(start中內容)。