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

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

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

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

那什么样的具体情况,使用ArrayList会出现问题?

同一进程 但不同线程之间才会出现问题
如果都定义在线程内不会出现问题
定义在进程,不同线程访问则出现问题

还是有点晕。
ps:程序里没有写线程相关代码。
再问:同时执行导出功能算是并发操作吗?是多线程操作吗?

没有写不代表没有。
不过可以很肯定的对你说,你的这种做法不会存在任何线程安全问题

首先感谢回复。

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

>什么具体情况下会线程不安全,会并发
多线程同时访问就是并发,这里访问主要指写,全部是读的情况不用担心,如果有一个线程是写,那么就会产生线程不安全性,需要使用同步锁保证修改独占。

象你这个情况,读到集合后,如果不进行修改,都是从集合读取数据,就不用担心线程安全性,所以,用arrayList就可以。

程序中不含多线程,自己写一个多线程不算。这样的情况就不会存在线程问题,都由框架或底层替你做了,你不需要关心。如果你写web程序,其实每个请求都是一个线程。

“如果你写web程序,其实每个请求都是一个线程。”要的就是这句话,非常感谢!!

同时感谢每一位朋友和banq大师。

每个请求就是一个线程,多个用户同时请求就是多线程了,同样在web中需要注意线程安全。

初级阶段可以理解前面一句,高级阶段要重视后面一句。J2EE本质是一个多用户系统.


[该贴被admin于2008-09-24 17:37修改过]

是啊,经banq大师一提,问题又出来了:
还是根据题目实际情况来分析,多个用户同时执行提交功能,那就是多线程操作!
而程序中是把数据库中的数据读取后add至arraylist变量中,那么多个线程的请求会同时add至arraylist变量,这样数据就会大于实际读取的数据!??
可我同时点击的时候,Excel导出的数据依然正确,这就是我不解的地方。
ps:同时点击,会有一个时间差,假设1s。但数据量大,程序执行需要数秒,所以这个时间差不会影响“模拟多线程”。
还请大师再赐教。

先自己回答:
如果每次请求都是实例化arraylist(关键在这里),单独给其分配内存空间。那即使多用户同时操作,arraylist在add的时候,就不会出现安全问题!??



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 */

首先要说明的是多线程问题,是指多个线程对同一资源的存取---多线程问题并不是指多个线程同时存在的问题---即使多个线程同时存在,但没有共同的资源可以争夺也构不成多线程问题。

楼主的例子中,同时导出8个Excel文件,也不会出现多线程问题,因为各线程都有各自的数据可以操作,不会去操作别人占有的数据,所以这个程序本身不存在多线程问题。

大家一定分清楚:多个线程 != 多线程
[该贴被yangyiqian于2009-01-03 13:57修改过]