
1 /* 內容:同步代碼塊,目的是解決多線程中的安全問題。什么安全問題呢??就是在執行run方法時,假如線程-0剛剛獲得執行權, 2 *還沒執行時,就掛那了,這時線程-1獲得執行權,並進行執行,就有可能出現負數票的情況。 3 *原因:當一個線程執行run方法時,線程1操作共享數據時,失去了cpu執行權,導致線程2執行run方法,從而導致共享數據錯誤。 4 * 解決辦法:給多線程所要執行的代碼加上鎖。當一個線程執行run方法時,鎖上鎖,即使失去CPU執行權, 5 *從而使其他線程不能執行run方法; 6 * synchronized(對象_){同步代碼}:同步代碼塊,其中包含多線程共同執行的代碼,此代碼被同步. 7 * 其中的對象就像一個鎖.即使執行同步代碼的線程失去CPU執行權,其他線程也會被鎖在外面不能執行同步代碼 8 * 疑惑:obj對象??/畢老師當時沒講,只說了可以是任意對象,他直接調用的object上帝類建立了對象; 9 * 例子:火車中的廁所 10 * 同步前提:1,必須有兩個或者兩個以上的線程 11 * 2,這些線程必須是使用的同一個鎖.(原因舉例:3,4節車廂的廁所,不是同一個鎖,線程1,線程2可以同時進入3,4節車廂的廁所,不能達到同步的目的. 12 *好出:解決了多線程的安全問題 13 *弊端:每次都得判斷鎖,浪費了資源. 14 */ 15 package ThreadDemoOne; 16 class TicketDemo implements Runnable 17 { 18 int ticket=1000; 19 Object obj =new Object(); 20 public void run() 21 { 22 while(true) 23 { 24 synchronized(obj)//obj就是一個鎖,這里的synchronized就是同步代碼塊.括起來的就是線程需要一次性執行完的代碼. 25 { 26 27 if(ticket>0) 28 { 29 System.out.println(Thread.currentThread()+"號售票員"+"這是第"+this .ticket+"張票"); 30 ticket--; 31 } 32 } 33 34 } 35 } 36 } 37 public class ThreadDemo6 38 { 39 public static void main(String[] args ) 40 { 41 TicketDemo t=new TicketDemo(); 42 Thread t1=new Thread(t); 43 Thread t2=new Thread(t); 44 t1.start(); 45 t2.start(); 46 47 } 48 49 50 51 } 52 /*運行結果摘取: 53 54 Thread[Thread-1,5,main]號售票員這是第156張票 55 Thread[Thread-1,5,main]號售票員這是第155張票 56 Thread[Thread-1,5,main]號售票員這是第154張票 57 Thread[Thread-0,5,main]號售票員這是第153張票 58 Thread[Thread-0,5,main]號售票員這是第152張票 59 60 */ 61 62