Java線程並發:知識點,java線程知識點
Java線程並發:知識點
發布:一個對象是使它能夠被當前范圍之外的代碼所引用:
常見形式:將對象的的引用存儲到公共靜態域;非私有方法中返回引用;發布內部類實例,包含引用。
逃逸:在對象尚未准備好時就將其發布。
不要讓this引用在構造函數中逸出。例,在構造函數中啟動線程,線程會包含對象的引用。
同步容器:對容器的所有狀態進行穿行訪問,Vector、Hashtable,Cllections.synchronizedMap|List
並發容器:ConcurrentHashMap,CopyOnWriteArrayList,ConcurrentLinkedQueue、BlockingQueue
list 隨機訪問特性的優勢。
Blocking 增加了可阻塞的get set操作
ConcurrentHashMap:分離鎖,為並發訪問帶來的高的吞吐量,同時幾乎沒有損失單個線程的訪問性能。返回弱一致性的迭代器。
迭代器的弱一致性,在迭代器生成以後會檢測容器的修改變化。
並發容器 size(), isEmpty() 弱化,返回近似結果。
CopyOnWriteArrayList:每次修改容器時復制,適用迭代需求大於修改需求情況。
生產者消費者模式,運用有界阻塞隊列解耦生產者和消費者的代碼。
Executor任務執行框架,實現了生產者消費者模式。
SynchronousQueue:put等待消費者可用,take等待生產者可用,適用於消費者充足的情景。
雙端隊列(deque)關聯於竊取工作模式(work stealing),區別於生產者消費者模式中所有消費者共享一個工作隊列,工作竊取模式每一個消費者都有自己的雙端隊列,如果一個消費者完成自己的全部工作,就可以偷取其它消費者隊列隊尾的任務。
工作竊取模式適用於當運行到一個任務的某一個單元時,可能會識別出更多的任務,如遍歷文件。
當一個方法能夠拋出InterruptedException時,說明它是可阻塞方法。拋出或捕獲InterruptedException。
Synchronizer:同步者---semaphore、barrier、latch,封裝狀態,決定線程在此狀態下的行為(通過或阻塞),提供操控狀態的方法,高效的等待同步者進入期望的狀態。
latch閉鎖:延遲線程進度直到線程到達一個終點狀態,像一個一次性開關。可以用來確保特定活動直到其它活動完成才發生。
例如:
FutureTask可以作為閉鎖,抽象的可攜帶結果的計算,通過callable實現。Future.get依賴於任務的執行狀態,任務運行完成則返回結果,否則一直等待,
Executor框架利用FutureTask完成異步任務。
semapher信號量:用來控制能夠同時訪問某特定資源的活動數量或同時執行某一給定操作的數量,資源池,容器邊界。
barrier關卡:類似於閉鎖,區別所有的線程必須同時到達關卡,才能繼續處理,閉鎖等待的是時間,關卡等待的是其它線程,重復使用。通過關卡,await會為每一個線程返回唯一的到達索引號,可以用它來選舉產生一個領導,在下一次迭代中承擔一些特殊任務。
Exchanger一種關卡的形式。