『壹』 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高並發,如何解決,什麼方式解決,高並發
首先,為防止高並發帶來的系統壓力,或者高並發帶來的系統處理異常,數據紊亂,可以以下幾方面考慮:1、加鎖,這里的加鎖不是指加java的多線程的鎖,是指加應用所和資料庫鎖,應用鎖這邊通常是使用redis的setnx來做,其次加資料庫鎖,因為代碼中加了應用所,所以資料庫不建議加悲觀鎖(排他鎖),一般加樂觀鎖(通過設置一個seq_no來解決),這兩個鎖一般能解決了,最後做合理的流控,丟棄一部分請求也是必不可少的
『叄』 java中什麼是並發,如何解決
多個進程或線程同時(或著說在同一段時間內)訪問同一資源會產生並發問題。 銀行兩操作員同時操作同一賬戶就是典型的例子。比如A、B操作員同時讀取一餘額為1000元的賬戶,A操作員為該賬戶增加100元,B操作員同時為該賬戶減去
50元,A先提交,B後提交。 最後實際賬戶余額為1000-50=950元,但本該為 1000+100-50=1050。這就是典型的並發問題。
可以用鎖解決。
關於鎖我也不是太清楚,你可以研究一下.....
『肆』 談論java中怎樣處理高並發的問題
對於我們開發的網站,如果網站的訪問量非常大的話,那麼我們就需要考慮相關的並發訪問問題了。而並發問題是絕大部分的程序員頭疼的問題,
但話又說回來了,既然逃避不掉,那我們就坦然面對吧~今天就讓我們一起來研究一下常見的並發和同步吧。
為了更好的理解並發和同步,我們需要先明白兩個重要的概念:同步和非同步
1、同步和非同步的區別和聯系
所謂同步,可以理解為在執行完一個函數或方法之後,一直等待系統返回值或消息,這時程序是出於阻塞的,只有接收到
返回的值或消息後才往下執行其它的命令。
非同步,執行完函數或方法後,不必阻塞性地等待返回值或消息,只需要向系統委託一個非同步過程,那麼當系統接收到返回
值或消息時,系統會自動觸發委託的非同步過程,從而完成一個完整的流程。
同步在一定程度上可以看做
『伍』 javaweb項目有可能有大量的寫入並發操作的場景嗎比如3秒內有一千萬條對資料庫增刪改的請求
當然有,12306春運期間的在線買票你應該知道,不過你這輩子可能很難遇到這種情況。
要處理這種並發量,需要很多技術支持,也是一個很復雜的工程,也不是一兩句話能講清楚的...。
『陸』 java並發編程主要用來解決什麼問題,應用場景是什麼
解決性能問題.多個線程一起跑.可以使用多個cpu.
另外有時外部系統會成為瓶頸,多個並發,可以避免對於外部系統的等待.
所以基本上網路編程都是並發的. 大量數據需要處理的代碼也往往會用並發來提速.
『柒』 JAVA的並發執行應用在什麼情況下用合適
首先對java的線程類Thread來進行說明:
Thread是針對是java其本身所具有的,但並不能說其沒有調用操作系統,其最底層的時間片調度是按照操作系統來執行的。
Thread下可以創建Thread,2個Thread在一定條件下也可以相互調用。
根據以上特點可以總結認為java中的線程能讓高級程序員更好的對龐大和復雜的數據流進行拆分,重組從而減低各個環節性能需求,通過增加各項負荷達到系統資源分配的最優值。
舉個例子:一個程序需要需要一個2.0GHZ的CPU,佔用10%的CPU使用1小時才能得出結果,最差方案就是用1小時。但有了線程使用多線程,在假設所有線程都可以並發執行的前提下我可以使用,10個線程讓CPU利用率達到100%,這時我只要6分鍾就可以有結果,雖然這些結果分散在10個不同的線程內,我可以再得到10個結果後對10個結果進行處理,得出最終結果,無論從時間維度還是CPU使用率維度,使用多線程是最優解。
『捌』 有哪些Java web里的並發框架,都有哪些
一、並發是一種需求,以下先介紹一下javaweb對於高並發的處理思路:
1、synchronized 關鍵字
可用來給對象和方法或者代碼塊加鎖,當它鎖定一個方法或者一個代碼塊的時候,同一時刻最多隻有一個線程執行這段代碼。可能鎖對象包括: this, 臨界資源對象,Class 類對象
2、同步方法
同步方法鎖定的是當前對象。當多線程通過同一個對象引用多次調用當前同步方法時, 需同步執行。
3、同步代碼塊
同步代碼塊的同步粒度更加細致,是商業開發中推薦的編程方式。可以定位到具體的同步位置,而不是簡單的將方法整體實現同步邏輯。在效率上,相對更高。
A)鎖定臨界對象
同步代碼塊在執行時,是鎖定 object 對象。當多個線程調用同一個方法時,鎖定對象不變的情況下,需同步執行。
B)鎖定當前對象
4、鎖的底層實現
Java 虛擬機中的同步(Synchronization)基於進入和退出管程(Monitor)對象實現。同步方法 並不是由 monitor enter 和 monitor exit 指令來實現同步的,而是由方法調用指令讀取運行時常量池中方法的 ACC_SYNCHRONIZED 標志來隱式實現的。
5、鎖的種類
Java 中鎖的種類大致分為偏向鎖,自旋鎖,輕量級鎖,重量級鎖。
鎖的使用方式為:先提供偏向鎖,如果不滿足的時候,升級為輕量級鎖,再不滿足,升級為重量級鎖。自旋鎖是一個過渡的鎖狀態,不是一種實際的鎖類型。
鎖只能升級,不能降級。
6、volatile 關鍵字
變數的線程可見性。在 CPU 計算過程中,會將計算過程需要的數據載入到 CPU 計算緩存中,當 CPU 計算中斷時,有可能刷新緩存,重新讀取內存中的數據。在線程運行的過程中,如果某變數被其他線程修改,可能造成數據不一致的情況,從而導致結果錯誤。而 volatile 修飾的變數是線程可見的,當 JVM 解釋 volatile 修飾的變數時,會通知 CPU,在計算過程中, 每次使用變數參與計算時,都會檢查內存中的數據是否發生變化,而不是一直使用 CPU 緩存中的數據,可以保證計算結果的正確。
更多、此外還有很多細節需要通過學習去了解和完善,此處就不一一列舉了。
二、並發框架
並發框架很多,如ExecutorService、RxJava、Disruptor、Akka等,具體選擇哪個(或者都不選擇)是根據項目需求選擇的,框架本身的差異並不大,基本都是如下模式
『玖』 java並發集合有哪些
1、常用的並發集合類
ConcurrentHashMap:線程安全的HashMap的實現
CopyOnWriteArrayList:線程安全且在讀操作時無鎖的ArrayList
CopyOnWriteArraySet:基於CopyOnWriteArrayList,不添加重復元素
ArrayBlockingQueue:基於數組、先進先出、線程安全,可實現指定時間的阻塞讀寫,並且容量可以限制
LinkedBlockingQueue:基於鏈表實現,讀寫各用一把鎖,在高並發讀寫操作都多的情況下,性能優於ArrayBlockingQueue
2、原子類
AtomicInteger:線程安全的Integer,基於CAS(無阻塞,CPU原語),優於使用同步鎖的Integer
3、線程池
ThreadPoolExecutor:一個高效的支持並發的線程池,可以很容易的講一個實現了Runnable介面的任務放入線程池執行,但要用好這個線程池,必須合理配置corePoolSize、最大線程數、任務緩沖隊列,以及隊列滿了+線程池滿時的回絕策略,一般而言對於這些參數的配置,需考慮兩類需求:高性能和緩沖執行。
Executor:提供了一些方便的創建ThreadPoolExecutor的方法。
FutureTask:可用於非同步獲取執行結果或取消執行任務的場景,基於CAS,避免鎖的使用
4、鎖
ReentrantLock:與synchronized效果一致,但是又更加靈活,支持公平/非公平鎖、支持可中斷的鎖、支持非阻塞的tryLock(可超時)、支持鎖條件等,需要手工釋放鎖,基於AbstractQueueSynchronizer
ReentrantReadWriteLock:與ReentrantLock沒有關系,採用兩把鎖,用於讀多寫少的情形