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 }