问题

java_zhaidp 2009-06-03 04:40:50

jsp是单用户多线程的。
ArrayList是不安全的。
---------------------------------------------------------------------
<%
ArrayList arr = new ArrayList();//线程安全?
%>
...全文
92 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
j1223jesus 2009-06-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sprite26 的回复:]
类 速度 多线程安全性 适用方面
Vector 慢 安全 提供了线程序同 步,在多线程是安全的.
ArrayList 快 不安全 多线程不安全
二者各有特点,要看你怎么取舍.
日常编码的时候,一般都是单线程程序,采用arraylist较好.
在涉及到网络编程.进程合作的时候,多线程共享变量的时候,采用vector好,举个例子,数据库缓冲池采用vector而不是arraylist.
[/Quote]
up
Yedy2000 2009-06-08
  • 打赏
  • 举报
回复
mark
fyofmee 2009-06-07
  • 打赏
  • 举报
回复
看有没有线程要求~~~
izard999 2009-06-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sprite26 的回复:]
类 速度 多线程安全性 适用方面
Vector 慢 安全 提供了线程序同 步,在多线程是安全的.
ArrayList 快 不安全 多线程不安全
二者各有特点,要看你怎么取舍.
日常编码的时候,一般都是单线程程序,采用arraylist较好.
在涉及到网络编程.进程合作的时候,多线程共享变量的时候,采用vector好,举个例子,数据库缓冲池采用vector而不是arraylist.
[/Quote]
正点..UP
qinyupandeng 2009-06-07
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 java_zhaidp 的回复:]
感谢诸位!
ArrayList实现不是同步的,是何意?
如果 <%...%>中的线程安全,是否可以认为 <%....%>无线程问题?
[/Quote]

ArrayList实现不是同步的,是何意?
在ArrayList做多线程时,不安全!
如果 <%...%>中的线程安全,是否可以认为 <%....%>无线程问题?
对!但在<%!...%>就有问题了!
java_zhaidp 2009-06-07
  • 打赏
  • 举报
回复
-----
java_zhaidp 2009-06-06
  • 打赏
  • 举报
回复
20楼,谢!
---------------------------------------------------------------------------------------------------------------------------------------------
注意,此实现不是同步的。如果多个线程同时访问一个 ArrayList 实例,而其中至少一个线程从结构上修改了列表,那么它必须 保持外部同步。(结构上的修改是指任何添加或删除一个或多个元素的操作,或者显式调整底层数组的大小;仅仅设置元素的值不是结构上的修改。)这一般通过对自然封装该列表的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedList 方法将该列表“包装”起来。这最好在创建时完成,以防止意外对列表进行不同步的访问:

List list = Collections.synchronizedList(new ArrayList(...));
此类的 iterator 和 listIterator 方法返回的迭代器是快速失败的:在创建迭代器之后,除非通过迭代器自身的 remove 或 add 方法从结构上对列表进行修改,否则在任何时间以任何方式对列表进行修改,迭代器都会抛出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就会完全失败,而不是冒着在将来某个不确定时间发生任意不确定行为的风险。

注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败迭代器会尽最大努力抛出 ConcurrentModificationException。因此,为提高这类迭代器的正确性而编写一个依赖于此异常的程序是错误的做法:迭代器的快速失败行为应该仅用于检测 bug。

---------何意?

java_zhaidp 2009-06-05
  • 打赏
  • 举报
回复
感谢诸位!
ArrayList实现不是同步的,是何意?
如果<%...%>中的线程安全,是否可以认为<%....%>无线程问题?
qiheia 2009-06-05
  • 打赏
  • 举报
回复
ArrayList的线程安全与不安全对比演示 


import java.util.ArrayList;

import java.util.Collections;

import java.util.List;

import java.util.Random;

public class ThreadSafeDemo {

public static int demo(final List list, final int testCount) throws InterruptedException {

ThreadGroup group = new ThreadGroup(list.getClass().getName() + "@" + list.hashCode());

final Random rand = new Random();



Runnable listAppender = new Runnable() {

public void run() {

try {

Thread.sleep(rand.nextInt(2));

} catch (InterruptedException e) {

return;

}

list.add("0");

}

};



for (int i = 0; i < testCount; i++) {

new Thread(group, listAppender, "InsertList-" + i).start();

}



while (group.activeCount() > 0) {

Thread.sleep(10);

}



return list.size();

}

public static void main(String[] args) throws InterruptedException {

List unsafeList = new ArrayList();

List safeList = Collections.synchronizedList(new ArrayList());

final int N = 10000;

for (int i = 0; i < 10; i++) {

unsafeList.clear();

safeList.clear();

int unsafeSize = demo(unsafeList, N);

int safeSize = demo(safeList, N);

System.out.println("unsafe/safe: " + unsafeSize + "/" + safeSize);

}

}

}
shibenjie 2009-06-05
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 java_zhaidp 的回复:]
感谢诸位!
ArrayList实现不是同步的,是何意?
如果 <%...%>中的线程安全,是否可以认为 <%....%>无线程问题?
[/Quote]


得到同步的list
List list = Collections.synchronizedList(new ArrayList(...));
ArrayList实现不是同步的,是何意?
多线程操作ArrayList的时候会出错
blliy117 2009-06-04
  • 打赏
  • 举报
回复


jsp是像是线程级别的,如果你里边没有用到共用的,需要同步的资源,你大可放心安全问题
blliy117 2009-06-04
  • 打赏
  • 举报
回复
可以告诉你
如果是jsp里
那么你这段代码绝对是安全的
yyandlh 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sprite26 的回复:]
类        速度    多线程安全性  适用方面
Vector    慢        安全        提供了线程序同 步,在多线程是安全的.
ArrayList  快        不安全      多线程不安全
二者各有特点,要看你怎么取舍.
日常编码的时候,一般都是单线程程序,采用arraylist较好.
在涉及到网络编程.进程合作的时候,多线程共享变量的时候,采用vector好,举个例子,数据库缓冲池采用vector而不是arraylist.

[/Quote]
顶!
zjx2388 2009-06-04
  • 打赏
  • 举报
回复
还不知道lz的问题是什么?

看来我真ben了啊...
weiluo12 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sprite26 的回复:]
类 速度 多线程安全性 适用方面
Vector 慢 安全 提供了线程序同 步,在多线程是安全的.
ArrayList 快 不安全 多线程不安全
二者各有特点,要看你怎么取舍.
日常编码的时候,一般都是单线程程序,采用arraylist较好.
在涉及到网络编程.进程合作的时候,多线程共享变量的时候,采用vector好,举个例子,数据库缓冲池采用vector而不是arraylist.
[/Quote]
UP
adown 2009-06-04
  • 打赏
  • 举报
回复
同意4楼的解释!

注意,此实现不是同步的。如果多个线程同时访问一个 ArrayList 实例,而其中至少一个线程从结构上修改了列表,那么它必须 保持外部同步。(结构上的修改是指任何添加或删除一个或多个元素的操作,或者显式调整底层数组的大小;仅仅设置元素的值不是结构上的修改。)这一般通过对自然封装该列表的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedList 方法将该列表“包装”起来。这最好在创建时完成,以防止意外对列表进行不同步的访问:

List list = Collections.synchronizedList(new ArrayList(...));


此类的 iterator 和 listIterator 方法返回的迭代器是快速失败的:在创建迭代器之后,除非通过迭代器自身的 remove 或 add 方法从结构上对列表进行修改,否则在任何时间以任何方式对列表进行修改,迭代器都会抛出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就会完全失败,而不是冒着在将来某个不确定时间发生任意不确定行为的风险。

引用API原文。
pxjjava 2009-06-04
  • 打赏
  • 举报
回复
说的都很好...我没研究过这个..学习学习.
ty_seven 2009-06-04
  • 打赏
  • 举报
回复
<%ArrayList arr = new ArrayList();%>安全
<%!ArrayList arr = new ArrayList();%>不安全
money8899 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 java_zhaidp 的回复:]
我的理解:
因为jsp为每个请求创建一个线程,
所以jsp内arrayList对象从new到释放都在一个线程内,
因此,
<%
ArrayList arr = new ArrayList();//线程安全?
%>
是安全的。
因为外层是“安全的”,所以内层的arr是安全的。


但,CS时,如果没有特意的线程控制,实例对象的赋值可能会已有影响。
这种影响只是对于“实例对象的赋值”这一层面。

[/Quote]
有道理
java_zhaidp 2009-06-04
  • 打赏
  • 举报
回复
我的理解:
因为jsp为每个请求创建一个线程,
所以jsp内arrayList对象从new到释放都在一个线程内,
因此,
<%
ArrayList arr = new ArrayList();//线程安全?
%>
是安全的。
因为外层是“安全的”,所以内层的arr是安全的。


但,CS时,如果没有特意的线程控制,实例对象的赋值可能会已有影响。
这种影响只是对于“实例对象的赋值”这一层面。
在执行arrayList的function时,因为function是安全的,所以无论外层环境如何,arrayList的function一定是安全的。
加载更多回复(6)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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