1 public class Test_XCTB implements Runnable{ 2 Timer timer = new Timer(); 3 public static void main(String[] args) { 4 // TODO Auto-generated method stub 5 Test_XCTB test = new Test_XCTB(); 6 Thread t1 = new Thread(test); 7 Thread t2 = new Thread(test); 8 t1.setName("t1"); 9 t2.setName("t2"); 10 t1.start(); t2.start(); 11 } 12 public void run() { //由於Test_XCTB實現了Runnable接口,因此要重寫run方法 13 timer.add(Thread.currentThread().getName()); 14 } 15 16 } 17 18 class Timer{ 19 private static int num = 0; 20 public void add(String neme) { //或者public synchronized void add(String neme) 21 synchronized(this) { 22 num++; 23 try { 24 Thread.sleep(1);//休眠1毫秒 25 } catch (InterruptedException e) {} 26 27 System.out.println("This is the " + num + "th"); 28 29 } 30 } 31 } 32 33 /* 34 * 輸出結果爲:This is the 2th;This is the 2th;兩個num竟然同樣,與指望的1th和2th不同! 35 * 緣由在於在執行t1的時候,num++變成1;但遇到了sleep方法,因此t1中止,執行t2;此時num++變成2;而後在執行輸出語句。 36 * 但其實不加sleep語句也會遇到t1被打斷而出現同樣的結果。 37 * 解決方法是在num語句前加上synchronized(this){}方法,表示將當前線程鎖定,num也隨之被鎖定。 38 * 還能夠簡便的在public void add(String neme)方法處加上synchronize,變成public synchronize void add。 39 */