⑴ 在java中並行和並發機制的區別
並發與並行是兩個既相似而又不相同的概念:並發性,又稱共行性,是指能處理多個同時性活動的能力;並行是指同時發生的兩個並發事件,具有並發的含義,而並發則不一定並行,也亦是說並發事件之間不一定要同一時刻發生。
-------------------------------------------------------------
並發和並行的區別僅僅在發生時刻的不同嗎?
舉個例子理解一下,如:
假設有A、B 兩個事件
並行:
如果A和B都在15:30同時發生,A 的運行時間為 5 分鍾,B 的運行時間為 8 分鍾
在前5分鍾是並行,也包括並發,因為他們都是在同一時刻發生的
並發:
如果A在15:30發生,運行3分鍾後,B事件發生,在以後的5分鍾時間里,A和B 是並發的
-------------------------------------------------------------
並發,是在同一個cpu上同時(不是真正的同時,而是看來是同時,因為cpu要在多個程序間切換)運行多個程序。
並行,是每個cpu運行一個程序。
打個比方,並發,就像一個人(cpu)喂2個孩子(程序),輪換著每人喂一口,表面上兩個孩子都在吃飯。
並行,就是2個人喂2個孩子,兩個孩子也同時在吃飯。
⑵ java 並發執行任務 怎麼做
/**
* 定時器
* */
public class TimeThread extends Thread {
public void run() {
Timer time = new Timer();
TimerTask tst = new TimerTask();//定時執行Rptlog類中的run方法
time.schele(tst, 1000,10000);//1秒後執行,每10秒執行一次
}
}
接下來是實際執行的類
public class TimerSendTask extends java.util.TimerTask{
public void run() {
TimerTask tt = new TimerTask();
for(int i=0;i<service.getList().size();i++){//循環查詢任務
定時清理任務 實現代碼段...
....
}
}
}
再寫多個任務的類
在這個地方執行以下就好了
TimerTask tst = new TimerTask();//定時執行Rptlog類中的run方法
time.schele(tst, 1000,10000);//1秒後執行,每10秒執行一次
⑶ 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沒有關系,採用兩把鎖,用於讀多寫少的情形
⑷ java 並發問題
如果出現線程安全問題的話 用Synchronized修飾使用到這幾個變數的方法 或者用Synchronized塊把使用這幾個變數的語句包進去。
⑸ 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、在java中,高並發屬於一種編程術語,意思就是有很多用戶在訪問,導致系統數據不正確、糗事數據的現象。並發就是可以使用多個線程或進程,同時處理不同的操作。
⑻ java並發問題。求詳細解釋
四個線程訪問的是同一個對象apple,所以四個線程訪問同一個mount變數,如果沒有線程鎖的話,當線程A首先執行列印"A拿到了第100個蘋果",之後A線程進入睡眠100ms,此時cup將時間片分配給線程B但A線程任然掛起中,所以B線程拿到的mount任然是100,所以"B拿到了第100個蘋果",並發產生了(系統執行多線程任務時,cpu會輪流給每個線程分配時間片,時間片耗盡線程被掛起)
⑼ 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並發是什麼意思
是多線程,多個線程並發執行 處理方法:創建線程對象,創建啟動線程方法(start),等main方法線程結束後,自動調用start執行並處理線程體中內容(start中內容)。(註:「並發處理」並不是同時處理,是交替處理或是同步線程交替、等待) 線程還可以中斷、和別的線程同步等 線程的幾種狀態:新建態(NEW)、等待態1(sleep中)(TIMED_WAITING)、等待態2(wait中)(WAITING)、阻塞態(BLOCKED)、終止態(TERMINATED)