㈠ 有哪些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、在java中,高並發屬於一種編程術語,意思就是有很多用戶在訪問,導致系統數據不正確、糗事數據的現象。並發就是可以使用多個線程或進程,同時處理不同的操作。2、處理高並發的方法
對於一些大型網站,比如門戶網站,在面對大量用戶訪問、高並發請求方面,基本的解決方案集中在這樣幾個環節:使用高性能的伺服器、高性能的資料庫、高效率的編程語言、還有高性能的Web容器。
(1)動靜分離。靜態資源請求與動態請求分離,項目中需要訪問的圖片、聲音、js/css等靜態資源需要有獨立的存放位置,便於將來實現靜態請求分離時直接剝離出來,比如nginx可以直接配置圖片文件直接訪問目錄,而不需要經過tomcat。這樣tomcat就可以專注處理動態請求,操作資料庫數據處理之類的。靜態請求代理伺服器性能比tomcat高很多。
(2)引入緩存。資料庫緩存、頁面緩存,這東西好用不復雜,搞明白什麼地方適用最重要。簡單的例子是頻繁讀取,不修改的地方最適用。也是後續集群做數據共享的一個方式之一,集群環境下,經常會碰到數據共享問題。
(3)如果將來數據量大,單一資料庫成為瓶頸時,資料庫的讀寫分離來了。資料庫集群,讀寫分離,分表分區。
㈢ java並發,如何加鎖,哪些類是線程安全的
線程安全是指要控制多個線程對某個資源的有序訪問或修改,而在這些線程之間沒有產生沖突。
在Java里,線程安全一般體現在兩個方面:
1、多個thread對同一個java實例的訪問(read和modify)不會相互干擾,它主要體現在關鍵字synchronized。如ArrayList和Vector,HashMap和Hashtable(後者每個方法前都有synchronized關鍵字)。如果你在interator一個List對象時,其它線程remove一個element,問題就出現了。
2、每個線程都有自己的欄位,而不會在多個線程之間共享。它主要體現在java.lang.ThreadLocal類,而沒有Java關鍵字支持,如像static、transient那樣。
記得採納哦
㈣ java如何在一個類中並發執行該類其他方法
開個線程池,為每個方法的執行分配一個線程,創建一個hashmap結果集,每個方法執行完,將其存入hashmap中,最後通過判斷hashmap的大小,判斷所有方法線程是否執行完畢,執行完畢則返回該hashmap
㈤ java並發框架有哪些
Java並發框架java.util.concurrent是JDK5中引入到標准庫中的(採用的是Doug
Lea的並發庫)。該包下的類可以分為這么塊:
Executors
1)介面:
Executor(例子涉及):用來執行提交的Runnable任務的對象。是一個簡單的標准化介面,用來定義包括線程池、非同步IO、輕量級任務框架等等。任務可以由一個新創建的線程、一個已有任務執行線程、或是線程直接調用execute()來執行,可以串列也可並行執行,取決於使用的是哪個Executor具體類。
ExecutorService(例子涉及):Executor的子介面,提供了一個更加具體的非同步任務執行框架:提供了管理結束的方法,以及能夠產生Future以跟蹤非同步任務進程的方法。一個ExcutorService管理著任務隊列和任務調度。
ScheledExecutorService(例子涉及):ExecutorService的子介面,增加了對延遲和定期任務執行的支持。
Callable(例子涉及):一個返回結果或拋出異常的任務,實現類需要實現其中一個沒有參數的叫做call的方法。Callabe類似於Runnable,但是Runnable不返回結果且不能拋出checked
exception。ExecutorService提供了安排Callable非同步執行的方法。
Future(例子涉及):代表一個非同步計算的結果(由於是並發執行,結果可以在一段時間後才計算完成,其名字可能也就是代表這個意思吧),提供了可判斷執行是否完成以及取消執行的方法。
2)實現:
ThreadPoolExecutor和ScheledThreadPoolExecutor:可配置線程池(後者具備延遲或定期調度功能)。
Executors(例子涉及):提供Executor、ExecutorService、ScheledExecutorService、ThreadFactory以及Callable的工廠方法及工具方法。
FutureTask:對Future的實現
ExecutorCompletionService(例子涉及):幫助協調若干(成組)非同步任務的處理。
Queues
非阻塞隊列:ConcurrentLinkedQueue類提供了一個高效可伸縮線程安全非阻塞FIFO隊列。
阻塞隊列:BlockingQueue介面,有五個實現類:LinkedBlockingQueue(例子涉及)、ArrayBlockingQueue、SynchronousQueue、PriorityBlockingQueue和DelayQueue。他們對應了不同的應用環境:生產者/消費者、消息發送、並發任務、以及相關並發設計。
Timing
TimeUnit類(例子涉及):提供了多種時間粒度(包括納秒)用以表述和控制基於超時的操作。
Synchronizers 提供特定用途同步語境
Semaphore(例子涉及):計數信號量,這是一種經典的並發工具。
CountDownLatch(例子涉及):簡單的倒計數同步工具,可以讓一個或多個線程等待直到另外一些線程中的一組操作處理完成。
CyclicBarrier(例子涉及):可重置的多路同步工具,可重復使用(CountDownLatch是不能重復使用的)。
Exchanger:允許兩個線程在匯合點交換對象,在一些pipeline設計中非常有用。
Concurrent Collections
除隊列外,該包還提供了一些為多線程上下文設計的集合實現:ConcurrentHashMap、CopyOnWriteArrayList及CopyOnWriteArraySet。
注意:"Concurrent"前綴的類有別於"synchronized"前綴的類。「concurrent」集合是線程安全的,不需要由單排斥鎖控制的(無鎖的)。以ConcurrentHashMap為例,允許任何數量的並發讀及可調數量的並發寫。「Synchronized」類則一般通過一個單鎖來防止對集合的所有訪問,開銷大且伸縮性差。
㈥ Java並發框架都有哪些
java的並發工具類主要都在 java.util.concurrent 包,主要包括
locks部分:顯式鎖(互斥鎖和速寫鎖)相關;
atomic部分:原子變數類相關,是構建非阻塞演算法的基礎;
executor部分:線程池相關;
collections部分:並發容器相關;
tools部分:同步工具相關,如信號量、閉鎖、柵欄等功能
自己可以深究下下面的源碼和實現