如何解决如何在线程安全的环境中定义静态Arraylist
| 如何在线程安全的环境中定义静态Arraylist。我尝试了synced关键字,但听说从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;
}
因此有机会在同一时间进行读写请求
解决方法
这很大程度上取决于您将如何使用它。有几种选择:
使用
CopyOnWriteArrayList
-这是一种现代的并发实现,最适合于写入次数相对较少且读取次数较多的情况
使用通过Collections.synchronizedList
获得的同步包装器-它使您可以从以下位置访问“原始”未同步列表:在包含对象中,但是提供了对“外部世界”的线程安全访问。
Vector
是一个过时的,过时的集合实现,不应在新代码中使用。
,ѭ6是\“ ArrayList的线程安全变体,其中所有可变操作add
,set
等都是通过对基础数组进行全新复制来实现的”。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。