同一個(gè)方法中的被synchronized包裹的代碼塊與普通代碼塊
public?class?SynchronizedCodeblock?implements?Runnable{ static?SynchronizedCodeblock?instance1?=?new?SynchronizedCodeblock(); //static?SynchronizedCodeblock?instance2?=?new?SynchronizedCodeblock(); static?int?i?=?0; public?static?void?main(String[]?args)?{ Thread?t1?=?new?Thread(instance1); Thread?t2?=?new?Thread(instance1); t1.start(); t2.start(); while(t1.isAlive()?||?t2.isAlive()?)?{} System.err.println(i); System.err.println("finished!"); } public?void?run()?{ method(); } public?void?method()?{ //synchronized(SynchronizedCodeblock.class)?{ synchronized(this)?{ System.err.println("我是同步塊內(nèi)代碼,我叫:"+Thread.currentThread().getName()); for?(int?j?=?0;?j?<?10000;?j++) ????????{ System.err.println(Thread.currentThread().getName()?+":?"?+?i++); ????????} System.err.println("同步塊內(nèi)代碼運(yùn)行結(jié)束,我叫:"+Thread.currentThread().getName()); } System.err.println("我是同步塊外代碼,我叫:"+Thread.currentThread().getName()); for?(int?j?=?0;?j?<?100000;?j++) ????????{ System.err.println(Thread.currentThread().getName()?+":?"?+?i++); ????????} System.err.println("同步塊外代碼運(yùn)行結(jié)束,我叫:"+Thread.currentThread().getName()); } }
結(jié)果:
。。。
Thread-1: 219984
Thread-1: 219985
Thread-1: 219986
同步塊外代碼運(yùn)行結(jié)束,我叫:Thread-1
219987
finished!
我不太明白,當(dāng)某個(gè)線程執(zhí)行到ssynchronized代碼塊發(fā)現(xiàn)拿不到鎖時(shí),該線程會(huì)跳過(guò)這端代碼,然后執(zhí)行下面的代碼嗎,如果是這樣,我就不理解了,這兩塊代碼都在一個(gè)線程,為什么不會(huì)順序執(zhí)行呢,jvm做了什么,迷惑,求教?
2019-01-20
每個(gè)對(duì)象都有一個(gè)請(qǐng)求頭,請(qǐng)求頭里面不僅有當(dāng)前鎖被哪個(gè)線程獲取的狀態(tài)標(biāo)識(shí),也有鎖的類型,是輕量級(jí),重量,可偏向,等有阻塞隊(duì)列, 這就像是juc包里面aqs的實(shí)現(xiàn)用chl。 就是說(shuō),兩個(gè)線程獲取一把鎖,一個(gè)線程拿到了,另一個(gè)線程的狀態(tài)就會(huì)變成block阻塞,阻塞了就不受cpu機(jī)制的控制了,只有等拿到鎖的線程釋放了鎖,這個(gè)block的線程才會(huì)變成就緒狀態(tài),等待cpu分配,去競(jìng)爭(zhēng)這個(gè)鎖。
2019-01-17
我對(duì)jvm不太了解,但用Linux中的給你解釋下。
當(dāng)一個(gè)線程想去獲取一把鎖而獲取不到時(shí),是處在一個(gè)死循環(huán)狀態(tài)。
while( 沒(méi)有得到鎖)
{
???? 嘗試獲取鎖;
}
所以就相當(dāng)于死在了這個(gè)循環(huán)里面。
當(dāng)然還有嘗試鎖,先嘗試獲取,沒(méi)獲取到就退出,而不是死在循環(huán)中。
鎖的內(nèi)容還有很多,慢慢學(xué)吧。