如何在线程安全环境中定义静态Arraylist

时间:2011-05-23 10:54:06

标签: java static thread-safety java.util.concurrent

如何在线程安全环境中定义静态Arraylist。我已经尝试过synchronized关键字,但我听说使用java并发包中的Automic类是静态arraylist的最佳解决方案。任何人都可以告诉我们如何以安全的方式声明和使用静态arraylist吗?

更新

在我的代码中,我有一个静态列表来维护那些在应用程序中登录的详细信息

private static List<UserSessionForm> userSessionList = new ArrayList<UserSessionForm>();

在登录和访问主页(访问所有时间主页)期间检查userSessionList中的用户详细信息,如果无法在userSessionList中添加详细信息,则在注销时从列表中删除用户详细信息。 在登录期间

if (getUserSessionIndex(uform)!=-1) {
            this.getUserSession().add(usform);
            this.getSession().setAttribute("customerId", getCustomer_id());
        }
注销期间

  public void logout(){
     int index = getUserSessionIndex(usform);
        //if user is  already loginned, remove that user from the usersession list
        if (index != -1) {
            UserAction.getUserSession().remove(index);
        }
   }

  private int getUserSessionIndex(UserSessionForm usform) {
    int index = -1;
    int tmp_index = 0;
    for (UserSessionForm tmp : UserAction.getUserSession()) {
        if (usform.equals(tmp)) {
            if (usform.getUserlogin_id() == tmp.getUserlogin_id()) {
                index = tmp_index;
                break;
            }
        }
        tmp_index += 1;
    }
    return index;
}

因此有可能同时进行读写请求

2 个答案:

答案 0 :(得分:4)

这很大程度上取决于你将如何使用它。有几种选择:

  • 使用CopyOnWriteArrayList - 这是一个现代的并发实现,最适合写入和读取次数相对较少的
  • 使用通过Collections.synchronizedList获得的同步包装器 - 它允许您从例如{{3}}访问“原始”非同步列表。在包含对象内,但提供对“外部世界”的线程安全访问。

Vector是一个旧的,过时的集合实现,不应该在新代码中使用。

答案 1 :(得分:3)

java.util.concurrent.CopyOnWriteArrayList是“ArrayList的线程安全变体,其中所有变异操作addset等都是通过创建底层数组的新副本来实现的”