線程聲明
- implements Runable -> run
public class myRunable implements Runnable{
@Override
public void run() {
// TODO do some thread things
}
}
- implements Callable -> call
有返回值善绎,通過(guò)FutureTask封裝后注入Thread中執(zhí)行俺猿,可異步獲取執(zhí)行結(jié)果
public class myCallable implements Callable<Integer>{
@Override
public Integer call() throws Exception {
// TODO do some thread things
return null;
}
}
- extends Thread -> run
線程池Excutor
- cachedThreadPool
一個(gè)任務(wù)創(chuàng)建一個(gè)線程
- fixedThreadPool
固定線程數(shù)量
- singleThreadPool
固定1個(gè)線程
線程調(diào)度操作方法
- sleep()
阻塞線程然低,繼續(xù)持有鎖和資源,設(shè)置時(shí)間后會(huì)自動(dòng)繼續(xù)行施、
- wait()
阻塞線程叶骨,放棄鎖和資源進(jìn)入等待喚醒隊(duì)列
- notify()
通知喚醒隊(duì)列內(nèi)某個(gè)線程掛起
- notifyAll()
通知喚醒隊(duì)列內(nèi)所有線程掛機(jī),準(zhǔn)備競(jìng)爭(zhēng)鎖
- yield()
降權(quán)
- join()
阻塞線程姓言,當(dāng)前線程阻塞瞬项,執(zhí)行join線程內(nèi)容蔗蹋,join線程執(zhí)行結(jié)束繼續(xù)執(zhí)行當(dāng)前線程
- deamon
非主線程
- condition
依賴Lock何荚,使用Lock時(shí),方法wait猪杭,signal餐塘,signalAll代替OBJ的wait,notify皂吮,notifyAll
協(xié)作戒傻,通信,鎖
- 通信
- 阻塞同步
假如A和B同時(shí)競(jìng)爭(zhēng)對(duì)象O鎖蜂筹,A先獲取了鎖- synchronized
對(duì)象B會(huì)一直等待A釋放鎖需纳,適合競(jìng)爭(zhēng)不是很多的情況,且java自身會(huì)對(duì)sync優(yōu)化艺挪。依賴于JVM實(shí)現(xiàn)
- ReentrantLock(lock)
對(duì)象B會(huì)等待一定時(shí)間后不翩,中斷等待干其他事情,適合競(jìng)爭(zhēng)多的情況麻裳,同步操作有更多的操作方法口蝠。JDK實(shí)現(xiàn),自旋鎖實(shí)現(xiàn)津坑,使用了CAS
a) lock(), 如果獲取了鎖立即返回妙蔗,如果別的線程持有鎖,當(dāng)前線程則一直處于休眠狀態(tài)疆瑰,直到獲取鎖
b) tryLock(), 如果獲取了鎖立即返回true眉反,如果別的線程正持有鎖,立即返回false穆役;
c)tryLock(long timeout,TimeUnit unit)寸五, 如果獲取了鎖定立即返回true,如果別的線程正持有鎖孵睬,會(huì)等待參數(shù)給定的時(shí)間播歼,在等待的過(guò)程中,如果獲取了鎖定掰读,就返回true秘狞,如果等待超時(shí),返回false蹈集;
d) lockInterruptibly:如果獲取了鎖定立即返回烁试,如果沒(méi)有獲取鎖定,當(dāng)前線程處于休眠狀態(tài)拢肆,直到或者鎖定减响,或者當(dāng)前線程被別的線程中斷
鎖
- 自旋
由于鎖的操作需要用戶態(tài)-核心態(tài)的轉(zhuǎn)換消耗靖诗,對(duì)于鎖控制時(shí)間短的,下一個(gè)線程自己等待一下鎖釋放支示,就減少了狀態(tài)轉(zhuǎn)換消耗
- 樂(lè)觀 CAS
- 偏向
第一次執(zhí)行CAS刊橘,然后給該線程標(biāo)記,以后若沒(méi)有競(jìng)爭(zhēng)則該線程一直將鎖消除
- 死鎖
死鎖產(chǎn)生的四個(gè)必要條件
互斥條件:資源是獨(dú)占的且排他使用颂鸿,進(jìn)程互斥使用資源促绵,即任意時(shí)刻一個(gè)資源只能給一個(gè)進(jìn)程使用,其他進(jìn)程若申請(qǐng)一個(gè)資源嘴纺,而該資源被另一進(jìn)程占有時(shí)败晴,則申請(qǐng)者等待直到資源被占有者釋放。
不可剝奪條件:進(jìn)程所獲得的資源在未使用完畢之前栽渴,不被其他進(jìn)程強(qiáng)行剝奪尖坤,而只能由獲得該資源的進(jìn)程資源釋放。
請(qǐng)求和保持條件:進(jìn)程每次申請(qǐng)它所需要的一部分資源闲擦,在申請(qǐng)新的資源的同時(shí)慢味,繼續(xù)占用已分配到的資源。
循環(huán)等待條件:在發(fā)生死鎖時(shí)必然存在一個(gè)進(jìn)程等待隊(duì)列{P1,P2,…,Pn},其中P1等待P2占有的資源佛致,P2等待P3占有的資源贮缕,…,Pn等待P1占有的資源俺榆,形成一個(gè)進(jìn)程等待環(huán)路感昼,環(huán)路中每一個(gè)進(jìn)程所占有的資源同時(shí)被另一個(gè)申請(qǐng),也就是前一個(gè)進(jìn)程占有后一個(gè)進(jìn)程所深情地資源罐脊。
解決死鎖
一是死鎖預(yù)防定嗓,就是不讓上面的四個(gè)條件同時(shí)成立。
二是萍桌,合理分配資源宵溅。
三是使用銀行家算法,如果該進(jìn)程請(qǐng)求的資源操作系統(tǒng)剩余量可以滿足上炎,那么就分配
AtomicXXXX
CAS操作完成原子性
CopyOnWriteXXX
先復(fù)制一份副本恃逻,在副本中進(jìn)行操作,其ADD是經(jīng)過(guò)lock鎖的藕施,操作完成寇损,將原地址指向改為副本地址指向,完成對(duì)數(shù)組的安全操作裳食。內(nèi)存消耗高矛市,實(shí)時(shí)性低。復(fù)制的目的是進(jìn)行讀寫分離诲祸,寫操作不影響原數(shù)據(jù)讀浊吏。讀不加鎖而昨。適合讀多寫少的需求。