SummerVocation_Learning--java的線程同步

 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  */
相關文章
相關標籤/搜索