亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

同一個方法中的被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做了什么,迷惑,求教?


正在回答

2 回答

每個對象都有一個請求頭,請求頭里面不僅有當前鎖被哪個線程獲取的狀態標識,也有鎖的類型,是輕量級,重量,可偏向,等有阻塞隊列, 這就像是juc包里面aqs的實現用chl。 就是說,兩個線程獲取一把鎖,一個線程拿到了,另一個線程的狀態就會變成block阻塞,阻塞了就不受cpu機制的控制了,只有等拿到鎖的線程釋放了鎖,這個block的線程才會變成就緒狀態,等待cpu分配,去競爭這個鎖。

0 回復 有任何疑惑可以回復我~

我對jvm不太了解,但用Linux中的給你解釋下。
當一個線程想去獲取一把鎖而獲取不到時,是處在一個死循環狀態。

while( 沒有得到鎖)
{
???? 嘗試獲取鎖;
}

所以就相當于死在了這個循環里面。

當然還有嘗試鎖,先嘗試獲取,沒獲取到就退出,而不是死在循環中。

鎖的內容還有很多,慢慢學吧。

1 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

同一個方法中的被synchronized包裹的代碼塊與普通代碼塊

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號