synchronized(){}同步代碼塊筆記(新手筆記,歡迎糾正)


 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  
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM