前幾天面試笔刹,本來(lái)一切還好,然后最后談到了java的線(xiàn)程钢属,最后被淘汰了徘熔,理由是說(shuō)我不太了解線(xiàn)程。好吧淆党,對(duì)于線(xiàn)程這一塊的API確實(shí)接觸的少酷师,都怪Android封裝的太好了,一般情況下都不怎么會(huì)直接和線(xiàn)程直接打交道染乌。所以急救仔細(xì)梳理一下java 的線(xiàn)程API山孔。
synchronized修飾的方法
1.某個(gè)對(duì)象實(shí)例內(nèi),synchronized aMethod(){}可以防止多個(gè)線(xiàn)程同時(shí)訪(fǎng)問(wèn)這個(gè)對(duì)象的synchronized方法(如果一個(gè)對(duì)象有多個(gè)synchronized方法荷憋,只要一個(gè)線(xiàn) 程訪(fǎng)問(wèn)了其中的一個(gè)synchronized方法台颠,其它線(xiàn)程不能同時(shí)訪(fǎng)問(wèn)這個(gè)對(duì)象中任何一個(gè)synchronized方法)。這時(shí)勒庄,不同的對(duì)象實(shí)例的 synchronized方法是不相干擾的串前。也就是說(shuō),其它線(xiàn)程照樣可以同時(shí)訪(fǎng)問(wèn)相同類(lèi)的另一個(gè)對(duì)象實(shí)例中的synchronized方法实蔽;
2.某個(gè)類(lèi)的范圍荡碾,synchronized static aStaticMethod{}防止多個(gè)線(xiàn)程同時(shí)訪(fǎng)問(wèn)這個(gè)類(lèi)中的synchronized static 方法。它可以對(duì)類(lèi)的所有對(duì)象實(shí)例起作用局装。因?yàn)樗逆i是類(lèi)級(jí)別的坛吁,所以對(duì)1中的鎖沒(méi)有影響劳殖。
synchronized 方法的缺陷
同步方法,這時(shí)synchronized鎖定的是哪個(gè)對(duì)象呢拨脉?它鎖定的是調(diào)用這個(gè)同步方法對(duì)象哆姻。也就是說(shuō),當(dāng)一個(gè)對(duì)象 P1在不同的線(xiàn)程中執(zhí)行這個(gè)同步方法時(shí)玫膀,它們之間會(huì)形成互斥矛缨,達(dá)到同步的效果。但是這個(gè)對(duì)象所屬的Class所產(chǎn)生的另一對(duì)象P2卻可以任意調(diào)用這個(gè)被加 了synchronized關(guān)鍵字的方法.同步方法實(shí)質(zhì)是將synchronized作用于object reference帖旨。――那個(gè)拿到了P1對(duì)象鎖的線(xiàn)程劳景,才可以調(diào)用P1的同步方法,而對(duì)P2而言碉就,P1這個(gè)鎖與它毫不相干,程序也可能在這種情形下擺脫同步機(jī)制的控制闷串,造成數(shù)據(jù)混亂瓮钥。
若將一個(gè)大的方法聲明為synchronized 將會(huì)大大影響效率,典型地烹吵,若將線(xiàn)程類(lèi)的方法 run() 聲明為 synchronized 碉熄,由于在線(xiàn)程的整個(gè)生命期內(nèi)它一直在運(yùn)行,因此將導(dǎo)致它對(duì)本類(lèi)任何 synchronized 方法的調(diào)用都永遠(yuǎn)不會(huì)成功肋拔。當(dāng)然我們可以通過(guò)將訪(fǎng)問(wèn)類(lèi)成員變量的代碼放到專(zhuān)門(mén)的方法中锈津,將其聲明為 synchronized ,并在主方法中調(diào)用來(lái)解決這一問(wèn)題凉蜂,但是 Java 為我們提供了更好的解決辦法琼梆,那就是 synchronized 塊。
synchronized 代碼塊
//這個(gè)等同與synchronized修飾的成員方法
public void a(){
synchronized (this){
}
}
//這個(gè)等同與synchronized修飾的靜態(tài)方法方法
public static void b(){
synchronized (MainActivity.class){
}
}