『壹』 java高並發
1、在java中,高並發屬於一種編程術語,意思就是有很多用戶在訪問,導致系統數據不正確、糗事數據的現象。並發就是可以使用多個線程或進程,同時處理不同的操作。2、處理高並發的方法
對於一些大型網站,比如門戶網站,在面對大量用戶訪問、高並發請求方面,基本的解決方案集中在這樣幾個環節:使用高性能的伺服器、高性能的資料庫、高效率的編程語言、還有高性能的Web容器。
(1)動靜分離。靜態資源請求與動態請求分離,項目中需要訪問的圖片、聲音、js/css等靜態資源需要有獨立的存放位置,便於將來實現靜態請求分離時直接剝離出來,比如nginx可以直接配置圖片文件直接訪問目錄,而不需要經過tomcat。這樣tomcat就可以專注處理動態請求,操作資料庫數據處理之類的。靜態請求代理伺服器性能比tomcat高很多。
(2)引入緩存。資料庫緩存、頁面緩存,這東西好用不復雜,搞明白什麼地方適用最重要。簡單的例子是頻繁讀取,不修改的地方最適用。也是後續集群做數據共享的一個方式之一,集群環境下,經常會碰到數據共享問題。
(3)如果將來數據量大,單一資料庫成為瓶頸時,資料庫的讀寫分離來了。資料庫集群,讀寫分離,分表分區。
『貳』 什麼是java並發性 深度剖析Java的並發性
做並發編程之前,必須首先理解什麼是並發,什麼是並行。
並發(concurrency)和並行(parallellism)關系:
解釋一:並行是指兩個或者多個事件在同一時刻發生;而並發是指兩個或多個事件在同一時間間隔發生。
解釋二:並行是在不同實體上的多個事件,並發是在同一實體上的多個事件。
解釋三:在一台處理器上「同時」處理多個任務,在多台處理器上同時處理多個任務。如hadoop分布式集群
所以並發編程的目標是充分的利用處理器的每一個核,以達到最高的處理性能。
『叄』 Java高並發,如何解決,什麼方式解決1
高並發系統的設計需要注意一下幾點:
用jprofiler等工具找出性能瓶頸,減少額外的開銷。
盡量使用緩存,包括用戶緩存,信息緩存等,多花點內存來做緩存,可以大量減少與資料庫的交互,提高性能。
優化資料庫查詢語句,減少直接使用hibernate等工具的直接生成語句(僅耗時較長的查詢做優化)。
優化資料庫結構,多做索引,提高查詢效率。
統計的功能盡量做緩存,或按每天一統計或定時統計相關報表,避免需要時進行統計的功能。
能使用靜態頁面的地方盡量使用,減少容器的解析(盡量將動態內容生成靜態html來顯示)。
硬體上就是提高伺服器性能,提升允許最大訪問量,代碼上面可以使用連接池的方式,更合理的規劃連接,提高連接的有效利用率
負載均衡(軟體負載均衡、硬體負載均衡)
分布式資料庫(資料庫主從分布、資料庫分割、資料庫緩存)
可以採用nginx或者lvs軟體工具,他好像最高支持65535的並發訪問。
實實在在太大的話,終極解決方式隊列方式,通過mq一個一個排隊方式,跟12306一樣。
『肆』 JAVA高並發問題,大數據,頻繁I/O操作。
建議採用緩存處理,按照你說的這種數據量,基於redis的緩存完全可以滿足,存取速度可以10W+的,另外,擬採用的hashMap 是ConcurrentHashMap還是其他,頁面展示是增量查詢還是直接所有的再查詢一次,socket數據接收你是用的netty還是mina,這都需要經過仔細的斟酌考慮設計的。有這么大的並發的需求,完全可以考慮做分布式集群的,估計這只是領導想要的目標吧
『伍』 java高並發,如何解決,什麼方式解決,高並發
首先,為防止高並發帶來的系統壓力,或者高並發帶來的系統處理異常,數據紊亂,可以以下幾方面考慮:1、加鎖,這里的加鎖不是指加java的多線程的鎖,是指加應用所和資料庫鎖,應用鎖這邊通常是使用redis的setnx來做,其次加資料庫鎖,因為代碼中加了應用所,所以資料庫不建議加悲觀鎖(排他鎖),一般加樂觀鎖(通過設置一個seq_no來解決),這兩個鎖一般能解決了,最後做合理的流控,丟棄一部分請求也是必不可少的
『陸』 java並發(1)線程模型
程序並不能單獨運行,只有將程序裝載到內存中,系統為它分配資源才能運行,而這種執行的程序就稱之為進程。程序和進程的區別就在於:程序是指令的集合,它是進程運行的靜態描述文本;進程是程序的一次執行活動,屬於動態概念
主要歸咎於兩點. 一個是由實現決定的,一個是由需求決定的.
線程由線程ID,程序計數器(PC)[用於指向內存中的程序指令],寄存器集合[由於存放本地變數和臨時變數]和堆棧[用於存放方法指令和方法參數等]組成。
以 Unix/Linux 的體系架構為例。
因為操作系統的資源是有限的,如果訪問資源的操作過多,必然會消耗過多的資源,而且如果不對這些操作加以區分,很可能造成資源訪問的沖突。所以,為了減少有限資源的訪問和使用沖突,對不同的操作賦予不同的執行等級(有多大能力做多大的事),用戶態(User Mode)和內核態(Kernel Mode)。
運行於用戶態的進程可以執行的操作和訪問的資源都會受到極大的限制,而運行在內核態的進程則可以執行任何操作並且在資源的使用上沒有限制。
並發 :一個時間段內有很多的線程或進程在執行,但何時間點上都只有一個在執行,多個線程或進程爭搶時間片輪流執行。
並行 :一個時間段和時間點上都有多個線程或進程在執行。
線程有三種模型, 一對一,多對一,多對多.具體參考 一篇文章讀懂Java多線程模型 , 這里只描述一對一的情況.
每個用戶線程都映射到一個內核線程,每個線程都成為一個獨立的調度單元,由內核調度器獨立調度,一個線程的阻塞不會影響到其他線程,從而保障整個進程繼續工作.
JVM 沒有限定 Java 線程需要使用哪種線程模型來實現, JVM 只是封裝了底層操作系統的差異,而不同的操作系統可能使用不同的線程模型,例如 Linux 和 windows 可能使用了一對一模型,solaris 和 unix 某些版本可能使用多對多模型。所以一談到 Java 語言的多線程模型,需要針對具體 JVM 實現。
Sun JDK 1.2開始,線程模型都是基於操作系統原生線程模型來實現,它的 Window 版和 Linux 版都是使用系統的 1:1 的線程模型實現的。
『柒』 北京北大青鳥:Java並發編程常用的類和集合
AtomicInteger可以用原子方式更新int值。
類AtomicBoolean、AtomicInteger、AtomicLong和AtomicReference的實例各自提供對相應類型單個變數的訪問和更新。
java課程培訓機構http://www.kmbdqn.cn/認為基本的原理都是使用CAS操作:booleancompareAndSet(expectedValue,updateValue);如果此方法(在不同的類間參數類型也不同)當前保持expectedValue,則以原子方式將變數設置為updateValue,並在成功時報告true。
循環CAS,參考AtomicInteger中的實現:publicfinalintgetAndIncrement(){for(;;){intcurrent=get();intnext=current+1;if(compareAndSet(current,next))returncurrent;}}(intexpect,intupdate){returnunsafe.compareAndSwapInt(this,valueOffset,expect,update);}ABA問題因為CAS需要在操作值的時候檢查下值有沒有發生變化,如果沒有發生變化則更新,但是如果一個值原來是A,變成了B,又變成了A,那麼使用CAS進行檢查時會發現它的值沒有發生變化,但是實際上卻變化了。
ABA問題的解決思路就是使用版本號。
在變數前面追加上版本號,每次變數更新的時候把版本號加一,那麼A-B-A就會變成1A-2B-3A。
從Java1.5開始JDK的atomic包里提供了一個類AtomicStampedReference來解決ABA問題。
這個類的compareAndSet方法作用是首先檢查當前引用是否等於預期引用,並且當前標志是否等於預期標志,如果全部相等,則以原子方式將該引用和該標志的值設置為給定的更新值。
ArrayBlockingQueue一個由數組支持的有界阻塞隊列。
此隊列按FIFO(先進先出)原則對元素進行排序。
隊列的頭部是在隊列中存在時間最長的元素。
隊列的尾部是在隊列中存在時間最短的元素。
新元素插入到隊列的尾部,隊列獲取操作則是從隊列頭部開始獲得元素。
這是一個典型的「有界緩存區」,固定大小的數組在其中保持生產者插入的元素和使用者提取的元素。
一旦創建了這樣的緩存區,就不能再增加其容量。
試圖向已滿隊列中放入元素會導致操作受阻塞;試圖從空隊列中提取元素將導致類似阻塞。
此類支持對等待的生產者線程和使用者線程進行排序的可選公平策略。
默認情況下,不保證是這種排序。
然而,通過將公平性(fairness)設置為true而構造的隊列允許按照FIFO順序訪問線程。
公平性通常會降低吞吐量,但也減少了可變性和避免了「不平衡性」。
LinkedBlockingQueue一個基於已鏈接節點的、范圍任意的blockingqueue。
此隊列按FIFO(先進先出)排序元素。
隊列的頭部是在隊列中時間最長的元素。
隊列的尾部是在隊列中時間最短的元素。
新元素插入到隊列的尾部,並且隊列獲取操作會獲得位於隊列頭部的元素。
鏈接隊列的吞吐量通常要高於基於數組的隊列,但是在大多數並發應用程序中,其可預知的性能要低。
可選的容量范圍構造方法參數作為防止隊列過度擴展的一種方法。
如果未指定容量,則它等於Integer.MAX_VALUE。
除非插入節點會使隊列超出容量,否則每次插入後會動態地創建鏈接節點。
如果構造一個LinkedBlockingQueue對象,而沒有指定其容量大小,LinkedBlockingQueue會默認一個類似無限大小的容量(Integer.MAX_VALUE),這樣的話,如果生產者的速度一旦大於消費者的速度,也許還沒有等到隊列滿阻塞產生,系統內存就有可能已被消耗殆盡了。
『捌』 java並發問題,如下
可以用鎖。 鎖就是阻止其它進程或線程進行資源訪問的一種方式,即鎖住的資源不能被其它請求訪問。在JAVA中,sychronized關鍵字用來對一個對象加鎖一般是執行完畢同步代碼塊(鎖住的代碼塊)後就釋放鎖,也可以用wait()方式半路上釋放鎖。wait()方式就好比蹲廁所到一半,突然發現下水道堵住了,不得已必須出來站在一邊,好讓修下水道師傅(准備執行notify的一個線程)進去疏通馬桶,疏通完畢,師傅大喊一聲: 「已經修好了」(notify),剛才出來的同志聽到後就重新排隊。
『玖』 java高並發,如何解決,什麼方式解決
高並發系統的設計需要注意一下幾點:
盡量使用緩存,包括用戶緩存,信息緩存等,多花點內存來做緩存,可以大量減少與資料庫的交互,提高性能。
用jprofiler等工具找出性能瓶頸,減少額外的開銷。
優化資料庫查詢語句,減少直接使用hibernate等工具的直接生成語句(僅耗時較長的查詢做優化)。
優化資料庫結構,多做索引,提高查詢效率。
統計的功能盡量做緩存,或按每天一統計或定時統計相關報表,避免需要時進行統計的功能。
能使用靜態頁面的地方盡量使用,減少容器的解析(盡量將動態內容生成靜態html來顯示)。
解決以上問題後,使用伺服器集群來解決單台的瓶頸問題。
基本上以上述問題解決後,達到系統最優。