我有两个或更多用户想要使用多个位置(卸货)的情况,但我需要确保其中只有一个在一个地方卸货而其他人等到他完成(如果有的话)订单在同一地点卸货。)
我正在考虑将位置名称存储在arraylist occupiedLocations
中,并在用户输入位置之前检查位置是否被占用,然后在完成时删除位置名称,但问题是是不是在不同的会话之间共享arraylist中的值。
我知道可以将值存储在数据库中,但是有另一个选项不需要从数据库写入/读取。
答案 0 :(得分:0)
最好的方法是使用带有读/写锁定的数据库,以防止在集群环境中运行时同时进行读取。
但这是专业解决方案。如果您打算在没有集群执行的情况下执行小型应用程序,ServletContext甚至包含此数据的Static属性就足够了。请确保sychronized
写入/读取此数据的方法。
一个非常简单的例子:
public static class MyApplicationSharedData {
private static ArrayList<String> locations = new ArrayList();
private static synchronized void writeLocation(String location) {
locations.add(location);
}
public static void waitForLocation(String location) {
while (locations.contains(location)) {
try {
Thread.sleep(1000);// sleep for a second while the location is bussy
} catch (InterruptedException e) {
log.error(e);
}
}
writeLocation(location);
}
public static synchronized void freeLocation(String location) {
locations.remove(location);
}
}
使用示例:
MyApplicationSharedData.waitForLocation("Denver");
// Do stuff
MyApplicationSharedData.freeLocation("Denver");