在不同会话之间共享字符串arraylist值

时间:2016-09-08 12:03:09

标签: java

我有两个或更多用户想要使用多个位置(卸货)的情况,但我需要确保其中只有一个在一个地方卸货而其他人等到他完成(如果有的话)订单在同一地点卸货。)

我正在考虑将位置名称存储在arraylist occupiedLocations中,并在用户输入位置之前检查位置是否被占用,然后在完成时删除位置名称,但问题是是不是在不同的会话之间共享arraylist中的值。 我知道可以将值存储在数据库中,但是有另一个选项不需要从数据库写入/读取。

1 个答案:

答案 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");