題主的問題可以理解為執行緒安全問題。
第一種:synchronized關鍵字,將操作共享資料的語句加入synchronized關鍵字,在某一時段只會讓一個執行緒執行完,在執行過程中,其他執行緒不能進來執行。如下程式碼,只需將class1增加如下標記部分:
public class TrainTickets implements Runnable{
int ticketnum = 20;
public void run(){
boolean a = true;
while (a) {
synchronized (this) { //新增
if (ticketnum > 0) {
System。out。println(Thread。currentThread()。getName() + “ 售出 ” + ticketnum + “號 票。”);
ticketnum——;
} else if (ticketnum <= 0) {
a = false;
}
try {
Thread。sleep(100);
} catch (Exception e) {
e。printStackTrace();
}
} //新增
}
}
}
第二種:使用Lock鎖,Lock使用起來比較靈活,但需要手動釋放和開啟。在併發量比較高的情況下,synchronized會讓效能下降,此時使用Lock是個不錯的方案。如下程式碼,只需將class1增加如下標記部分:
public class TrainTickets implements Runnable{
int ticketnum = 20;
Lock lock = new ReentrantLock();
public void run(){
boolean a = true;
while (a) {
try {
lock。lock();// 獲取鎖物件
if (ticketnum > 0) {
System。out。println(Thread。currentThread()。getName() + “ 售出 ” + ticketnum + “號 票。”);
ticketnum——;
} else if (ticketnum <= 0) {
a = false;
}
Thread。sleep(100);
} catch (Exception e) {
e。printStackTrace();
}finally{
lock。unlock();// 釋放鎖物件
}
}
}
}