1 回答

TA貢獻1772條經驗 獲得超5個贊
一些建議,不要使用公共靜態(tài)變量和靜態(tài)方法,如博物館.getGate() 或原子客戶計數器(這使得更難理解誰在使用什么)。此外,客戶端類應該與“計數器”邏輯完全隔離;也就是說,客戶端應該簡單地調用 gate.enter(),并且訪問檢查應該在 Gate 或 Museum 中完成。
然后是“關鍵”部分,您嘗試在其中為客戶分配“許可”,在
while (true) {
if (Gate.atomCustomer.get() < 5) {
//use museum.tryEnter() instead..
Museum.getGate(0).enter(this);
break;
}
}
在這里,如果兩個線程同時調用get() ,它們都會發(fā)現客戶的數量是eg。4,他們都會進入(并發(fā)問題)。
確保只有一個客戶端獲得許可的一種方法是將嵌套調用添加到某些同步方法,例如
private synchronized boolean tryEnter() {
if (counter<5) {
counter++;
return true;
}
else {
return false;
}
}
但是分配許可的更好方法是使用信號量(這樣你甚至不需要那個繁忙的循環(huán))。https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html
添加回答
舉報