如何在线程安全环境中定义静态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;
}
因此有可能同时进行读写请求
答案 0 :(得分:4)
这很大程度上取决于你将如何使用它。有几种选择:
CopyOnWriteArrayList
- 这是一个现代的并发实现,最适合写入和读取次数相对较少的Collections.synchronizedList
获得的同步包装器 - 它允许您从例如{{3}}访问“原始”非同步列表。在包含对象内,但提供对“外部世界”的线程安全访问。 Vector
是一个旧的,过时的集合实现,不应该在新代码中使用。
答案 1 :(得分:3)
java.util.concurrent.CopyOnWriteArrayList
是“ArrayList的线程安全变体,其中所有变异操作add
,set
等都是通过创建底层数组的新副本来实现的”