synchronized(this) 解釋
public class DemoThread implements Runnable {
public void run() {
synchronized(this) { //請(qǐng)問(wèn)這里的this怎樣理解,t1和t2的地址不是不一樣嘛,怎么會(huì)只有一個(gè)線(xiàn)程運(yùn)行???
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + " synchronized loop " + i);
}
}
}
public static void main(String[] args) {
DemoThread t1 = new DemoThread();
Thread ta = new Thread(t1, "A");
Thread tb = new Thread(t1, "B");
ta.start();
tb.start();
}
}
public void run() {
synchronized(this) { //請(qǐng)問(wèn)這里的this怎樣理解,t1和t2的地址不是不一樣嘛,怎么會(huì)只有一個(gè)線(xiàn)程運(yùn)行???
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + " synchronized loop " + i);
}
}
}
public static void main(String[] args) {
DemoThread t1 = new DemoThread();
Thread ta = new Thread(t1, "A");
Thread tb = new Thread(t1, "B");
ta.start();
tb.start();
}
}
解釋?zhuān)?br /> 這里的this是指當(dāng)前對(duì)象,也就是說(shuō)不管ta還是tb,剛開(kāi)始運(yùn)行這段代碼的時(shí)候會(huì)給這段代碼加個(gè)鎖,這樣即使運(yùn)行到中間被替換了,
另一個(gè)線(xiàn)程也不會(huì)執(zhí)行這段代碼,因?yàn)檫@段代碼加鎖了,而鑰匙在給代碼加鎖的那個(gè)線(xiàn)程手里,只有加鎖的線(xiàn)程運(yùn)行完這段代碼,才會(huì)給代碼解鎖.
然后其他線(xiàn)程才能執(zhí)行這段代碼.. 加個(gè)synchronized(this)以后運(yùn)行結(jié)果是這樣:
A synchronized loop 0
A synchronized loop 1
A synchronized loop 2
A synchronized loop 3
A synchronized loop 4
B synchronized loop 0
B synchronized loop 1
B synchronized loop 2
B synchronized loop 3
B synchronized loop 4
不加的話(huà)是這樣:(順序亂了,有好多種結(jié)果,這里只是其中一種)..
A synchronized loop 0
B synchronized loop 0
A synchronized loop 1
B synchronized loop 1
A synchronized loop 2
B synchronized loop 2
A synchronized loop 3
B synchronized loop 3
B synchronized loop 4
A synchronized loop 4
posted on 2012-09-27 16:03 小一敗涂地 閱讀(2028) 評(píng)論(0) 編輯 收藏 所屬分類(lèi): 并發(fā)、多線(xiàn)程 、java語(yǔ)言相關(guān)