同一個方法中的被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("我是同步塊內代碼,我叫:"+Thread.currentThread().getName()); for?(int?j?=?0;?j?<?10000;?j++) ????????{ System.err.println(Thread.currentThread().getName()?+":?"?+?i++); ????????} System.err.println("同步塊內代碼運行結束,我叫:"+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("同步塊外代碼運行結束,我叫:"+Thread.currentThread().getName()); } }
結果:
。。。
Thread-1: 219984
Thread-1: 219985
Thread-1: 219986
同步塊外代碼運行結束,我叫:Thread-1
219987
finished!
我不太明白,當某個線程執行到ssynchronized代碼塊發現拿不到鎖時,該線程會跳過這端代碼,然后執行下面的代碼嗎,如果是這樣,我就不理解了,這兩塊代碼都在一個線程,為什么不會順序執行呢,jvm做了什么,迷惑,求教?
2019-01-20
每個對象都有一個請求頭,請求頭里面不僅有當前鎖被哪個線程獲取的狀態標識,也有鎖的類型,是輕量級,重量,可偏向,等有阻塞隊列, 這就像是juc包里面aqs的實現用chl。 就是說,兩個線程獲取一把鎖,一個線程拿到了,另一個線程的狀態就會變成block阻塞,阻塞了就不受cpu機制的控制了,只有等拿到鎖的線程釋放了鎖,這個block的線程才會變成就緒狀態,等待cpu分配,去競爭這個鎖。
2019-01-17
我對jvm不太了解,但用Linux中的給你解釋下。
當一個線程想去獲取一把鎖而獲取不到時,是處在一個死循環狀態。
while( 沒有得到鎖)
{
???? 嘗試獲取鎖;
}
所以就相當于死在了這個循環里面。
當然還有嘗試鎖,先嘗試獲取,沒獲取到就退出,而不是死在循環中。
鎖的內容還有很多,慢慢學吧。