1 回答

TA贡献1772条经验 获得超5个赞
一些建议,不要使用公共静态变量和静态方法,如博物馆.getGate() 或原子客户计数器(这使得更难理解谁在使用什么)。此外,客户端类应该与“计数器”逻辑完全隔离;也就是说,客户端应该简单地调用 gate.enter(),并且访问检查应该在 Gate 或 Museum 中完成。
然后是“关键”部分,您尝试在其中为客户分配“许可”,在
while (true) {
if (Gate.atomCustomer.get() < 5) {
//use museum.tryEnter() instead..
Museum.getGate(0).enter(this);
break;
}
}
在这里,如果两个线程同时调用get() ,它们都会发现客户的数量是eg。4,他们都会进入(并发问题)。
确保只有一个客户端获得许可的一种方法是将嵌套调用添加到某些同步方法,例如
private synchronized boolean tryEnter() {
if (counter<5) {
counter++;
return true;
}
else {
return false;
}
}
但是分配许可的更好方法是使用信号量(这样你甚至不需要那个繁忙的循环)。https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html
添加回答
举报