,所以我用關鍵字測試。下面是我嘗試的例子:學習Java,使用synchronized關鍵字
public class MyTest {
static int i = 0;
public static void main(String[] args) {
new Thread(t1).start();
new Thread(t2).start();
}
private static void countMe(String name){
i++;
System.out.println("Current Counter is: " + i + ", updated by: " + name);
}
private static Runnable t1 = new Runnable() {
public void run() {
try{
for(int i=0; i<5; i++){
countMe("t1");
}
} catch (Exception e){}
}
};
private static Runnable t2 = new Runnable() {
public void run() {
try{
for(int i=0; i<5; i++){
countMe("t2");
}
} catch (Exception e){}
}
};
}
當我運行它,從兩個線程調用countMe()
方法的輸出產生以下輸出:
Current Counter is: 1
Current Counter is: 2
Current Counter is: 4
Current Counter is: 5
Current Counter is: 6
Current Counter is: 7
Current Counter is: 3
Current Counter is: 8
Current Counter is: 9
Current Counter is: 10
當我改變方法countMe()
到:
private synchronized static void countMe(){
i++;
System.out.println("Current Counter is: " + i);
}
我得到這樣的輸出:
Current Counter is: 1
Current Counter is: 2
Current Counter is: 3
Current Counter is: 4
Current Counter is: 5
Current Counter is: 6
Current Counter is: 7
Current Counter is: 8
Current Counter is: 9
Current Counter is: 10
雖然這給了我清醒的認識的目的,我想知道有沒有其他的原因還有,我們可以使用。或者我在這裏做了什麼,是唯一的艾森我們爲什麼需要使用這個關鍵字?
謝謝。
編輯:我很困惑與另一件事是,在第一輸出爲什麼櫃檯去3 7後這似乎有點不可能給我,但類似的結果確實發生每次我試圖,這是正常的?
不能保證線程會交替。計數3的線程可能不會打印,直到另一個線程計數到7之後。 – 2012-02-08 16:00:46
謝謝,但是像7之後如何能夠打印下一個3.我的意思是它可以打印6或甚至5,但這好像是新的方法調用在3歲之後沒有讀過我,這聽起來很奇怪。所以你認爲每當我必須使用來自2個或更多線程的相同代碼塊時總是使用同步應該是明智的? – 911TurboS 2012-02-08 16:04:29
我建議你打印出該線程的名稱,它會在混淆的地方變得更加明顯。併發是一個複雜的話題,沒有簡單的答案。我的首選是使用參與者模式,儘可能在線程間分享盡可能少的數據。理想情況下,沒有。一個線程非常有效地執行代碼通常綽綽有餘。 – 2012-02-08 16:09:12