关于List的线程安全问题

wangyeee 2010-04-13 08:52:28
RT
一般为了保证List的线程安全,会在初始化的时候使用Collections.synchronizedList方法,现在需要构造一个线程安全的LinkedList实例(必须是LinkedList,不能是List或者别的),使用如下代码编译能过,但运行时出错:

LinkedList<String> list = (LinkedList<String>) Collections
.synchronizedList(new LinkedList<String>());

报错内容:
“java.util.Collections$SynchronizedList cannot be cast to java.util.LinkedList”
也就是说无法类型转换,现在我使用下面的方法来构造一个LinkedList:

LinkedList<String> list = new LinkedList<String>(Collections
.synchronizedList(new LinkedList<String>()));

现在编译和运行都没问题了,请问现在的LinkedList还是线程安全的吗?
...全文
737 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
James.Ji 2010-04-14
  • 打赏
  • 举报
回复
第一个问题
LinkedList<String> list = (LinkedList<String>) Collections
.synchronizedList(new LinkedList<String>());
这样强转是肯定不行的,因为他返回的是一个内部类,实现了list的内部类,所以强转会报错。
第二个问题,返回的不是线程安全的,因为他是构造了一个新的LinkedList对象,唯一相同的就是内部元素的顺序是相同的,不能线程间同步
chenglin63155263 2010-04-14
  • 打赏
  • 举报
回复
引用jdk1.5帮助文档的内容东东:
List list = Collections.synchronizedList(new LinkedList());
renjianguokeivor 2010-04-13
  • 打赏
  • 举报
回复
学习ing
draem0507 2010-04-13
  • 打赏
  • 举报
回复
这个还真不懂,学习下。
ruisheng_412 2010-04-13
  • 打赏
  • 举报
回复
不是。。。
vcshcn 2010-04-13
  • 打赏
  • 举报
回复
没明白为什么必须是LinkedList类型,如果真的需要,是否说明jdk提供的接口不够用
「已注销」 2010-04-13
  • 打赏
  • 举报
回复
继承LinkedList,把所有函数重写一下,加上同步关键字
不过不推荐

现在都面向接口编程,直接操作List就行,为啥非要是LinkedList?
只要底层是LinkedList实现,你管它是哪个类呢
YBBPS1109 2010-04-13
  • 打赏
  • 举报
回复
ConcurrentLinkedQueue<E>
一个基于链接节点的无界线程安全队列。此队列按照 FIFO(先进先出)原则对元素进行排序。
  • 打赏
  • 举报
回复
不是线程安全的!

因为 LinkedList 的那个构造并不是装饰器构造,而只是将其中的元素作为新 LinkedList 的构造。

不知道你要实现什么功能,应用场景是什么,因此其他的就没办法给你回复了。
roonten 2010-04-13
  • 打赏
  • 举报
回复
是....................................只要同步就安全了

62,614

社区成员

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

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