2016-06-20 106 views
2

我有一個任務可以編寫簡單的預約系統,除了一件事我已經完成了,最後一個任務我無法正確理解,請問我可以怎麼處理這個最後的問題,因爲我不知道甚至如何形成一個關於它的問題,並在谷歌搜索:Java同步任務

  • 嘗試重新設計應用程序,以便它仍然是線程安全的,但不使用鎖定機制(即不同步或 java.util中。 concurrent.locks)

這是迄今爲止我所編寫的代碼:

public class Bus{ 

    private final boolean [] seats = new boolean[50]; 
    private int nextSeat = 0; 

    public void bookSeat() throws Exception{ 
     if(nextSeat<seats.length){ 
     seats[nextSeat]=true; 
     nextSeat++; 
     System.out.print("Seat number " +nextSeat+ " booked"); 
     }else{ 
      System.out.println("The bus is full sorry"); 
     } 
     } 

} 

public class Passenger extends Thread{ 

    Bus bus; 
    String passengerName; 

    public Passenger(Bus bus, String passengerName){ 
     this.bus=bus; 
     this.passengerName=passengerName; 
    } 

    public void run(){ 
     synchronized(bus){ 
      try { 
       bus.bookSeat(); 
       Thread.sleep(500); 
      } catch (Exception ex) { 
       Logger.getLogger(Passenger.class.getName()).log(Level.SEVERE, null, ex); 
      } 
      System.out.println("by " + passengerName); 

     } 
    } 

    public String getPassengerName() { 
     return passengerName; 
    } 

    public void setPassengerName(String passengerName) { 
     this.passengerName = passengerName; 
    } 
} 

public class Main { 
    public static void main(String [] args) throws InterruptedException{ 
     Bus someCompany = new Bus(); 

     Passenger p1 = new Passenger(someCompany,"Name1"); 
     Passenger p2 = new Passenger(someCompany, "Name2"); 

     p1.start(); 
     p2.start(); 

    } 
} 
+0

提示:嘗試從代碼中刪除同步的語句;並運行幾次。你會發現你總是得到不同的結果 - 因爲只要有一個以上的線程處理需要麻煩的數據。然後,您的任務就是設法避免這些問題(不使用同步,但使用其他方法)。 – GhostCat

+0

無鎖同步,如「AtomicBoolean」等可能是他們正在尋找的。 – Kayaman

回答

3

所以你需要使用類從包裝java.util.concurrent.atomic,他們確實讓你做出你的類線程安全的,無需支付鎖的價格,因爲他們提議一個無鎖的方法。

這是我會怎麼修改代碼,使其線程安全的,而無需使用內在明確鎖:

public class Bus { 

    private final AtomicIntegerArray seats = new AtomicIntegerArray(50); 
    private final AtomicInteger nextSeat = new AtomicInteger(); 

    public void bookSeat() throws Exception { 
     // get the next value, then increment the sequence 
     int next = nextSeat.getAndIncrement(); 
     // check if we don't exceed the size of the array 
     if (next < seats.length()){ 
      // Set the value at the index "next" to "1" for booked 
      seats.set(next, 1); 
      System.out.println("Seat number " +next+ " booked"); 
     } else { 
      System.out.println("The bus is full sorry"); 
     } 
    } 
} 

注:我使用AtomicIntegerArray,因爲沒有類似boolean並且我們 需要具有volatile值的數組,因此簡單地0false1true