synchronized(this) 解釋
public class DemoThread implements Runnable {
public void run() {
synchronized(this) { //請問這里的this怎樣理解,t1和t2的地址不是不一樣嘛,怎么會只有一個線程運行???
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) { //請問這里的this怎樣理解,t1和t2的地址不是不一樣嘛,怎么會只有一個線程運行???
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();
}
}
解釋:
這里的this是指當前對象,也就是說不管ta還是tb,剛開始運行這段代碼的時候會給這段代碼加個鎖,這樣即使運行到中間被替換了,
另一個線程也不會執(zhí)行這段代碼,因為這段代碼加鎖了,而鑰匙在給代碼加鎖的那個線程手里,只有加鎖的線程運行完這段代碼,才會給代碼解鎖.
然后其他線程才能執(zhí)行這段代碼.. 加個synchronized(this)以后運行結(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
不加的話是這樣:(順序亂了,有好多種結(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) 評論(0) 編輯 收藏 所屬分類: 并發(fā)、多線程 、java語言相關(guān)