相对Vector,ArrayList在什么的情况下会因异步出现问题

vzh818 2008-09-16 04:03:51
例:将数据库中10000条数据导出至Excel中。
1、将数据读取后保存在Vector里,再输出至Excel中。
2、将数据读取后保存在ArrayList里,再输出至Excel中。
以上两种方法都可以实现。

关键在于Vector是同步,线程安全;ArrayList非线程安全。

但我在两个页面上同时执行导出功能,导出的Excel数据均正常。这种同时执行导出功能算是并发操作吗?并发是因为哪些情况出现。

那什么样的具体情况,使用ArrayList会出现问题?
...全文
119 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
vzh818 2008-09-26
  • 打赏
  • 举报
回复
int rowId = 0;
List content = new Vector();//在这里实例化,每次分配新的内存空间。所以不管是vector还是arraylist都不会引起安全问题???

List rowContent = null;

for (int n = 0; n < mpmsOrdersInfoList.size(); n++){
rowId ++;
//设置内容
rowContent = new Vector();
/** 组织订单信息 start */
MpmsOrdersInfo ordersI = (MpmsOrdersInfo)mpmsOrdersInfoList.get(n);

// 取出集合数据放入数组中
String[] labelContent = this.getLableContent(ordersI, radioValue);

int allColumn = rowOneLine.size();

//遍历订单信息写入Excel中
int lableContentLength = labelContent.length;
for (int i = 0; i < lableContentLength; i++) {
if (i == 0) {
rowContent.add("" + (n+1));
}
rowContent.add(labelContent[i]);
}
//填充空格
for (int i = 0; i < allColumn - lableContentLength-1; i++) {
rowContent.add(null);
}
content.add(rowContent);
/** 组织订单信息 end */

/** 组织订单详细信息 start */
MpmsOrdersInfo orderInfo = mpmsOrderBO.getMpmsOrdersInfo(ordersI.getOrderId());
orderInfo.getCiUserInfo();

//组织订单内容列表
Set contentSet = orderInfo.getMpmsStockRelations();
List contentList = new Vector();
Iterator contentIt = contentSet.iterator();
while(contentIt.hasNext()){
contentList.add((MpmsStockRelation)contentIt.next());
}

for (int ci = 0; ci < contentList.size(); ci++){
rowContent = new Vector();
MpmsStockRelation mpmsStockRelation=(MpmsStockRelation)contentList.get(ci);
//取出订单详细信息数据放入数组中
String[] orderInfoContent = getOrderInfoContent(mpmsStockRelation);
//填充空格
for (int j = 0; j < lableContentLength + 1; j++) {
rowContent.add(null);
}
//遍历订单详细信息
for (int oi = 0; oi < orderInfoContent.length; oi++) {
if (oi == 0) {
rowContent.add("" + (ci+1));
}
rowContent.add(orderInfoContent[oi]);
}
content.add(rowContent);
}
/** 组织订单详细信息 end */

}
vzh818 2008-09-26
  • 打赏
  • 举报
回复
感谢Hokeen 和Gump09的点拔!
现在基本上明白了,如果每次请求都是实例化arraylist,单独给其分配内存空间。那即使多用户同时操作,arraylist在add的时候,就不会出现安全问题!??
Hokeen 2008-09-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 vzh818 的回复:]
首先感谢回复。

我就是想知道,客户在使用系统过程中,什么具体情况下会线程不安全,会并发??(程序中不含多线程,自己写一个多线程不算)

顶一下期待回答!
[/Quote]
楼主参照Gump09的回答,具体看你程序怎么写。如果每次请求都是同一个对象,对象内部被定义为ArrayList的成员变量在调用add或remove等其他改变List结构的操作(赋值不属于改变结构)时,就会发生多线程操作异常。
vzh818 2008-09-23
  • 打赏
  • 举报
回复
首先感谢回复。

我就是想知道,客户在使用系统过程中,什么具体情况下会线程不安全,会并发??(程序中不含多线程,自己写一个多线程不算)

顶一下期待回答!
vzh818 2008-09-23
  • 打赏
  • 举报
回复
首先感谢回复。

我就是想知道,客户在使用系统过程中,什么具体情况下会线程不安全,会并发??(程序中不含多线程,自己写一个多线程不算)

顶一下。
vzh818 2008-09-17
  • 打赏
  • 举报
回复
再问:同时执行导出功能,是多线程访问单一资源吗?
study_body 2008-09-17
  • 打赏
  • 举报
回复
将你的Vector或者ArrayList保存到request或者servletContext里面效果是不同的,这就是线程安全问题.
famousboy 2008-09-16
  • 打赏
  • 举报
回复
这要看你的2个ArrayList是不是同一个对象,如果不是,不会有问题
Gump09 2008-09-16
  • 打赏
  • 举报
回复
同步问题会在多线程访问单一资源时出错。
也就是说如果你的Arraylist是静态的,那么多线程访问就会出现问题。
但是如果针对每个请求,实例化一个arraylist 那么就不存在资源竞争的问题,这里的问题就变成了性能问题。
就是说如果一千个人同时导出那么你的server就可能不再响应。

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧