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();
}
}
提示:嘗試從代碼中刪除同步的語句;並運行幾次。你會發現你總是得到不同的結果 - 因爲只要有一個以上的線程處理需要麻煩的數據。然後,您的任務就是設法避免這些問題(不使用同步,但使用其他方法)。 – GhostCat
無鎖同步,如「AtomicBoolean」等可能是他們正在尋找的。 – Kayaman