java並發
A. 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沒有關系,採用兩把鎖,用於讀多寫少的情形
B. java 並發問題
如果出現線程安全問題的話 用Synchronized修飾使用到這幾個變數的方法 或者用Synchronized塊把使用這幾個變數的語句包進去。
C. java並發問題,如下
可以用鎖。 鎖就是阻止其它進程或線程進行資源訪問的一種方式,即鎖住的資源不能被其它請求訪問。在JAVA中,sychronized關鍵字用來對一個對象加鎖一般是執行完畢同步代碼塊(鎖住的代碼塊)後就釋放鎖,也可以用wait()方式半路上釋放鎖。wait()方式就好比蹲廁所到一半,突然發現下水道堵住了,不得已必須出來站在一邊,好讓修下水道師傅(准備執行notify的一個線程)進去疏通馬桶,疏通完畢,師傅大喊一聲: 「已經修好了」(notify),剛才出來的同志聽到後就重新排隊。
D. 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」類則一般通過一個單鎖來防止對集合的所有訪問,開銷大且伸縮性差。
E. java高並發是什麼意思,高並發的解釋
1、在java中,高並發屬於一種編程術語,意思就是有很多用戶在訪問,導致系統數據不正確、糗事數據的現象。並發就是可以使用多個線程或進程,同時處理不同的操作。
F. 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秒執行一次
G. java並發問題求解
T1 T2
1 update table set operator= '客戶端A' where id = 1;
2 update table set operator='客戶端B' where id = 1;
3 update table set name='更新數據' where operator='客戶端A'' and id=1
4 update table set name='更新數據' where operator='客戶端B'' and id=1
T*表示事務
1234,表示時間
假如在時間1毫秒將id=1的數據更新為該客戶端的名稱A。
此時在時間2上,有另外一個客戶端更新了id=1的operator客戶端B
在時間3上,事務1開始執行更新數據,此時opertor已經被T2更新了B,這時更新語句就不滿足了, 這時T1什麼也沒做。
因為資料庫不可能在同一時間,同時更新2條語句的。
H. JAVA如何實現並發
加鎖吧,
語法
synchronize(對象){ ...需要並發的代碼.... }
I. java中什麼是並發,如何解決
多個進程或線程同時(或著說在同一段時間內)訪問同一資源會產生並發問題。 銀行兩操作員同時操作同一賬戶就是典型的例子。比如A、B操作員同時讀取一餘額為1000元的賬戶,A操作員為該賬戶增加100元,B操作員同時為該賬戶減去
50元,A先提交,B後提交。 最後實際賬戶余額為1000-50=950元,但本該為 1000+100-50=1050。這就是典型的並發問題。
可以用鎖解決。
關於鎖我也不是太清楚,你可以研究一下.....
J. java並發問題。求詳細解釋
四個線程訪問的是同一個對象apple,所以四個線程訪問同一個mount變數,如果沒有線程鎖的話,當線程A首先執行列印"A拿到了第100個蘋果",之後A線程進入睡眠100ms,此時cup將時間片分配給線程B但A線程任然掛起中,所以B線程拿到的mount任然是100,所以"B拿到了第100個蘋果",並發產生了(系統執行多線程任務時,cpu會輪流給每個線程分配時間片,時間片耗盡線程被掛起)