第一章 Why 并行?
并行計算能應(yīng)用的兩個場景:圖像處理谎僻、服務(wù)端編程。
幾個概念
同步(Synchronous)和異步(Asynchronous)
并發(fā)(Concurrency)和并行(parallelism)
臨界區(qū)
阻塞(Blocking)和非阻塞(Non-blocking)
死鎖、饑餓、活鎖
并發(fā)級別
1.阻塞想暗; 2.無饑餓; 3.無障礙帘不; 4.無鎖说莫; 5.無等待
Amdahl定律和Gustafson定律:研究并行所能帶來的性能的提升程度。
JMM(Java內(nèi)存模型)
1.原子性寞焙;2.可見性储狭;3.有序性;
第二章 Java并行基礎(chǔ)
線程狀態(tài):
New棺弊、Runnable晶密、Blocked、Waiting模她、Timed_Waiting、Terminated
終止線程不用stop();
線程中斷:
public void Thread.interrupt(); ?//中斷線程
public boolean Thread.isInterrupted(); ?//判斷是否中斷
public static boolean Thread.interrupted(); ? //判斷是否中斷懂牧,并清楚當(dāng)前中斷狀態(tài)
wait()和notify():
存在于Object類侈净;
必須包含在對應(yīng)的synchronzied語句中,并且都要首先獲得目標(biāo)對象的一個監(jiān)視器僧凤。
掛起(suspend)和繼續(xù)執(zhí)行(resume)畜侦,和stop()一樣,不再使用躯保。
等待線程結(jié)束(join)和謙讓(yield)
volatile 關(guān)鍵字旋膳,可見性,不保證原子性途事;
線程組验懊、守護線程(Daemon)、線程優(yōu)先級(priority)
synchronized?關(guān)鍵字 :1.指定加鎖對象尸变;2.直接作用于實例方法义图;3.直接作用于靜態(tài)方法。
第三章 JDK并發(fā)包
重入鎖 ? java.util.concurrent.locks.ReentrantLock
lock.lock()召烂、lock.unlock()碱工、lock.lockInterruptibly()(中斷響應(yīng))、lock.tryLock()(限時等待)、公平鎖怕篷、
根據(jù)系統(tǒng)的調(diào)度历筝,一個線程會傾向于再次獲取已經(jīng)持有的鎖,這種分配方式高效廊谓,但無公平性梳猪。
Condition條件,搭配重入鎖使用蹂析。
await()舔示、singal()、awaitUninterruptibly()(在等待中不響應(yīng)中斷)
信號量(Semaphore)
acquire()电抚、tryAcquire()惕稻、release()
ReadWriteLock 讀寫鎖
倒計時器 CountDownLatch
countDown()、await()
循環(huán)柵欄 CyclicBarrier ?湊齊一批蝙叛,計數(shù)器歸零俺祠,執(zhí)行某一動作
線程池
Executor框架 ?newFixedThreadPool、newSingleThreadExecutor借帘、newCachedThreadPool蜘渣、newScheduledThreadPool...
計劃任務(wù) ?scheduleAtFixedRate、scheduleWithFixedDelay
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler hanler)
corePoolSize: 線程池中的線程數(shù)量肺然;
maximumPoolSize: 線程池中的最大線程數(shù)量蔫缸;
keepAliveTime: 當(dāng)線程池中線程數(shù)量超過corePoolSize時,多余的空閑線程的存活時間际起。
unit: keepAliveTime的單位
workQueue:任務(wù)隊列拾碌,用于保存被提交但未被執(zhí)行的線程;
(直接提交隊列街望、有界任務(wù)隊列校翔、無界的任務(wù)隊列、優(yōu)先任務(wù)隊列)
threadFactory:線程工廠灾前,用于創(chuàng)造線程防症,一般默認;
handler:拒絕策略哎甲;
(AbortPolicy蔫敲、CallerRunsPolicy、DiscardOledestPolicy烧给、DiscardPolicy)
擴展線程池 beforeExecute()燕偶、afterExecute()、terminated()
優(yōu)化線程池線程數(shù)量
Nthreads = Ncpu * Ucpu * ( 1 + W / C ) ?= cpu數(shù)量*目標(biāo)cpu使用率*(1+等待時間與計算時間的比率)
submit() vs execute()
并發(fā)集合 java.util.concurrent
ConcurrenHashMap础嫡、CopyOnWriteArrayList指么、ConcurrentLinkedQueue酝惧、BlockingQueue、ConcurrentSkipListMap(跳表)
第四章 ?鎖的優(yōu)化
有助于提高“鎖”性能的幾點建議:
1.減小鎖持有時間伯诬;
2.減小鎖粒度晚唇;(例如hashmap,分成16塊盗似,分塊加鎖)
3.讀寫分離鎖來代替獨占鎖哩陕;(讀多寫少的情況下)
4.鎖分離;(例如LinkedBlockingQueue赫舒,把take()和put()分離)
5.鎖粗化悍及;(主要值避免循環(huán)內(nèi)反復(fù)申請鎖)
Java虛擬機對鎖的優(yōu)化:
1.鎖偏向;
2.輕量級鎖接癌;
3.自旋鎖心赶;
4.鎖消除;
ThreadLocal:
ThreadLocalMap 保存了以每個線程為key的KV缺猛,類似HashMap缨叫;
在為每個線程各分配一個SimpleDateFormat、Ramdom等時能提高性能荔燎。
無鎖
比較變換(CAS):一種與眾不同的并發(fā)策略耻姥。
CAS(V,E有咨,N)琐簇。V表示要更新的變量,E表示預(yù)期值座享,N表示新值鸽嫂;僅當(dāng)V值等于E值時,才會將V的值設(shè)為N征讲;否則什么都不做。最后都返回當(dāng)前V值橡娄。
AtomicInteger诗箍、Unsafe類、AtomicReference挽唉、AtomicStampedReference(帶時間戳的對象引用)滤祖、AtomicIntegerArray、AtomicIntegerFieldUpdater(讓普通變量也享受原子操作)
無鎖的Vector實現(xiàn)瓶籽。(較難匠童,沒看懂)
SynchronousQueue的實現(xiàn)。
避免死鎖:無鎖函數(shù)塑顺、重入鎖的中斷或限時等待...