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还是线程安全的吗?

解决方案 »

  1.   

    不是线程安全的!因为 LinkedList 的那个构造并不是装饰器构造,而只是将其中的元素作为新 LinkedList 的构造。不知道你要实现什么功能,应用场景是什么,因此其他的就没办法给你回复了。
      

  2.   

    ConcurrentLinkedQueue<E>
    一个基于链接节点的无界线程安全队列。此队列按照 FIFO(先进先出)原则对元素进行排序。
      

  3.   

    继承LinkedList,把所有函数重写一下,加上同步关键字
    不过不推荐现在都面向接口编程,直接操作List就行,为啥非要是LinkedList?
    只要底层是LinkedList实现,你管它是哪个类呢
      

  4.   

    没明白为什么必须是LinkedList类型,如果真的需要,是否说明jdk提供的接口不够用
      

  5.   

    引用jdk1.5帮助文档的内容东东:
    List list = Collections.synchronizedList(new LinkedList());
      

  6.   

    第一个问题LinkedList<String> list = (LinkedList<String>) Collections
                    .synchronizedList(new LinkedList<String>());
    这样强转是肯定不行的,因为他返回的是一个内部类,实现了list的内部类,所以强转会报错。
    第二个问题,返回的不是线程安全的,因为他是构造了一个新的LinkedList对象,唯一相同的就是内部元素的顺序是相同的,不能线程间同步