線程安全加鎖的代碼塊的實現


 1:synchronized(同步的) 鎖住代碼塊. 同步代碼塊

1 synchronized(對象){ // 對象鎖.  一定要注意,這個對象是同一個對象.!!!!!!  "abc"
2     //代碼塊
3 }
4 
5 同一個時間片,只有一個線程來訪問這個代碼塊.

 

2: synchronized 鎖住方法,方法鎖

1 public  synchronized void meth(){  //同步方法.
2     
3 }
4 
5 多個線程來訪問這個方法的時候, 同一個時間片,只有一個線程來訪問這個方法

 

案例:一個車站有5個售票窗口,5號窗口正在售第1000張票,4號窗口正在售第999張票,3號窗口正在售第998張票……

 1 package com.lv.study.pm.first;
 2 
 3 //解決超賣
 4 //解決負數
 5 public class TicketDemoSy5 {
 6 
 7     public static void main(String[] args) {
 8 
 9         // 窗口
10         SellTicketThread4 s1 = new SellTicketThread4("窗口1");
11         SellTicketThread4 s2 = new SellTicketThread4("窗口2");
12         SellTicketThread4 s3 = new SellTicketThread4("窗口3");
13         SellTicketThread4 s4 = new SellTicketThread4("窗口4");
14         SellTicketThread4 s5 = new SellTicketThread4("窗口5");
15 
16         s1.start();
17         s2.start();
18         s3.start();
19         s4.start();
20         s5.start();
21 
22     }
23 
24 }
25 
26 class SellTicketThread4 extends Thread {
27 
28     // 全局唯一
29     private static int ticketNumber = 1000;
30 
31     private String name;
32 
33     public SellTicketThread4(String name) {
34         super();
35         this.setName(name);
36     }
37 
38     public SellTicketThread4() {
39 
40     }
41 
42     // 執行要賣票的業務
43     public void run() {
44 
45         while (ticketNumber > 0) {
46             
47             //指定一個鎖存儲的對象 不是指定要鎖的元素
48             synchronized ("n") {
49                 
50                 //必須要判斷一次來解決還有其他線程等着拿鎖的情況
51                 //就算拿到了鎖  符合不了要求也進不來
52                 if(ticketNumber>0){
53                     
54                     //同步代碼塊:同一個時間只有拿到鎖線程能夠訪問
55                     System.out.println(this.getName() + "開始賣第" + ticketNumber+"張票");
56                     ticketNumber--;
57                     
58                 }
59 
60             }
61 
62         }
63     }
64 
65 }

 


免責聲明!

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



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