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

你知道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 list = new LinkedList();

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常见问题回答可以分享给你。

推荐阅读:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值