線(xiàn)程停止
判斷線(xiàn)程是否停止
Thread.interrupt();
測(cè)試當(dāng)前線(xiàn)程是否停止廉丽,是指調(diào)用該方法的線(xiàn)程是否停止较幌。如果當(dāng)前狀態(tài)為已停止,調(diào)用該方法返回true少欺,并且清楚線(xiàn)程停止?fàn)顟B(tài)
this.isInterrupted();
測(cè)試this線(xiàn)程是否停止喳瓣,不會(huì)清除該線(xiàn)程的中斷狀態(tài)
暫停線(xiàn)程
使用suspend暫停線(xiàn)程的弊端
1.獨(dú)占:如果在運(yùn)行到臨界區(qū)時(shí)調(diào)用了suspend,將會(huì)導(dǎo)致獨(dú)占鎖赞别,從而導(dǎo)致其他線(xiàn)程無(wú)法進(jìn)入臨界區(qū)畏陕。
2.不同步:原本的原子操作,如果中途暫停仿滔,將會(huì)導(dǎo)致數(shù)據(jù)不一致惠毁。如先設(shè)置a變量后暫停,導(dǎo)致b變量沒(méi)有設(shè)置崎页,在讀取數(shù)據(jù)時(shí)只能獲取到更新后的a變量數(shù)據(jù)鞠绰。
volatile
兩個(gè)線(xiàn)程訪(fǎng)問(wèn)同一個(gè)變量時(shí),由于編譯器的優(yōu)化飒焦,會(huì)導(dǎo)致一個(gè)線(xiàn)程修改了這個(gè)變量蜈膨,另一個(gè)線(xiàn)程不能及時(shí)獲取最新的值。加入volatile修飾的變量將會(huì)關(guān)閉這種優(yōu)化。
synchronize方法
- 在方法聲明中加入的synchronize關(guān)鍵字相當(dāng)于synchronized(this)翁巍,如:
public synchronized void fun(){
//TODO method body
}
public void fun() {
synchronized (this) {
//TODO method body
}
}
- synchronize鎖可重入:當(dāng)一個(gè)線(xiàn)程得到一個(gè)對(duì)象鎖后驴一,再次請(qǐng)求對(duì)象鎖是可以得到鎖的。如果方法A灶壶、B都上了鎖肝断,線(xiàn)程在執(zhí)行A方法時(shí)得到了對(duì)象鎖,并且在A方法中調(diào)用了B方法驰凛,此時(shí)請(qǐng)求進(jìn)入B的對(duì)象鎖是可以成功的胸懈。
- synchronize不繼承,如子類(lèi)重寫(xiě)父類(lèi)方法簽名為
public synchronized void fun(){
//TODO method body
}
的方法時(shí)洒嗤,不加synchronize關(guān)鍵字箫荡,則不具備同步特性。