java linkedlist线程安全吗?是线程安全的吗?

KLQ 2020-06-03 15:55:57 java常见问答 9083

你知道linkedlist是否是线程安全的吗?下面的文章内容,要给大家介绍的就是这个方面的问题,一起来详细的了解一下吧。

在java当中,linkedlist是线程不安全的。

延伸阅读:

多线程当中,有多个线程访问linkedlist会出现什么问题?

1、在JDK代码当中,ListItr的add(), next(), previous(), remove(), set()方法都会跑出ConcurrentModificationException。

final void checkForComodification()
{
    if (modCount != expectedModCount)
        throw new ConcurrentModificationException();
}

在代码当中对linkedlist结构被修改的次数进行了记录。

在Iterator初始化的时候,任何通过Iterator修改LinkedList结构的行为,都会同时更新modCount以及expectedModCount和,使得着2个值相等。

通过LinkedList对象修改它的结构的方法只更新modCount。

所以,假如,有2个线程A和B。

A通过Iterator遍历,并且对linkedlist进行了修改,在这个时候,B通过对象修改其结构,那么Iterator的相关方法就会抛出异常。

这是比较容易发现的由线程竞争所造成的错误。

2、假如,2个线程都是通过LinkedList对象修改它的结构那么又会发生什么呢?

package linkedlist;
import java.util.Iterator; 
import java.util.LinkedList; 
import java.util.concurrent.Executors;
public class Test {
    private final LinkedList<Integer> list = new LinkedList<Integer>();
    public Test() { 
        Thread add1 = new Thread(new Runnable() {
            @Override 
            public void run() { 
                int number = 0; 
                while (true) { 
                    if (number == 10) 
                        number = 0; 
                    // System.out.println("Writing " + number); 
                    list.addFirst(number); 
                    int first = list.getFirst(); 
                    if (first != number) { 
                        System.err.println("ERROR!!! " + number + " " + first); 
                        System.exit(-1); 
                    } 
                    number++; 
                    System.out.flush(); 
                    try { 
                        Thread.sleep(2); 
                    } catch (InterruptedException e) { 
                        // TODO Auto-generated catch block 
                        e.printStackTrace(); 
                    } 
                } 
            } 
        });
        Thread add2 = new Thread(new Runnable() {
            @Override 
            public void run() { 
                int number = 100; 
                while (true) { 
                    if (number > 119) { 
                        number = 100; 
                    } 
                    // System.out.println("Writing " + letter); 
                    // System.out.flush(); 
                    list.addFirst(number); 
                    int first = list.getFirst(); 
                    if (first != number) { 
                        System.err.println("ERROR!!! " + number + " " + first); 
                        System.exit(-1); 
                    } 
                    number++; 
                    try { 
                        Thread.sleep(2); 
                    } catch (InterruptedException e) { 
                        // TODO Auto-generated catch block 
                        e.printStackTrace(); 
                    } 
                } 
            } 
        });
        Executors.newCachedThreadPool().execute(add1); 
        Executors.newCachedThreadPool().execute(add2); 
        // Executors.newCachedThreadPool().execute(read2); 
    }
    /** 
     * @param args 
     */ 
    public static void main(String[] args) { 
        Test test = new Test(); 
    } 
}

程序输出:

ERROR!!! 0 100

总的来说,线程安全问题是由多个线程同时写或者是同时读写同一个资源造成的。

java linkedlist是线程不安全的的哦。

你还想了解更多关于linkedlist方面的内容吗?请继续通过奇Q工具网的常见问题栏目来了解吧。更多java常见问题回答可以分享给你。

推荐阅读:

linkedlist类的特点,有什么特点?

线程安全的list该如何实现?

线程安全的类在java中有几种?如何成为线程安全类?