arraylist为啥线程不安全,arraylist线程安全问题

  arraylist为啥线程不安全,arraylist线程安全问题

  什么是线程不安全:

  当一个线程被多个线程访问时,采用锁机制。当一个线程访问这个类的一些数据时,它是被保护的,在这个线程读完之前,其他线程不能访问,其他线程只能使用。不会出现数据不一致或者数据污染的情况。线程不安全意味着不提供数据访问保护。有可能多个线程一个接一个地更改数据,导致脏数据。

  如何解决写爬虫IP受阻的问题?立即使用。

  一个ArrayList ,在添加一个元素的时候,它可能会有两步来完成:

  1.将此元素存储在Items[Size]的位置;

  2.增加尺寸的值。(推荐学习:Java视频教程)

  在单线程操作的情况下,如果Size=0,添加一个元素后,该元素在位置0,Size=1;

  但是,如果它是多线程的,例如有两个线程,线程A首先将元素存储在位置0。但此时CPU调度线程A暂停,线程B获得运行机会。线程B也向这个ArrayList中添加元素,因为此时大小仍然等于0(注意我们假设添加一个元素需要两步,而线程A只完成第一步),所以线程B也将元素存储在位置0。然后线程A和线程B都继续运行,增加Size的值。

  好了,现在我们来看看ArrayList的情况。实际上只有一个元素,存储在位置0,但大小等于2。这就是“线程不安全”。

  示例程序:

  包装测试;

  import Java . util . ArrayList;

  导入Java . util . list;

  公共类ArrayListInThread实现Runnable{

  ListString list 1=new ArrayList string();//不是线程安全的

  publicvoid run() {

  尝试{

  thread . sleep((int)(math . random()* 2));

  }

  catch(中断异常e) {

  e . printstacktrace();

  }

  list1.add(Thread.currentThread()。getName());

  }

  公共静态void main(String[] args)引发InterruptedException {

  thread group group=new thread group( my group );

  ArrayListInThread t=new ArrayListInThread();

  for(int I=0;我10000;i ) {

  Thread th=新线程(group,t,string . value of(I));

  th . start();

  }

  while (group.activeCount() 0) {

  Thread.sleep(十);

  }

  system . out . println();

  system . out . println(t . list 1 . size());//如果使用thread safecollection,应该是10000。

  }

  }如何解决线程不安全?

  一:使用synchronized关键字。这个大家应该很熟悉,我就不解释了;

  二:使用collections . synchronized list();用法如下:

  假设你创建了下面的代码:listmapstring,object data=newarraylistmapstring,object();

  所以要解决这个线程安全问题,可以像这样使用Collections.synchronizedList():

  ListMapString,Object data=collections . synchronized list(newArrayListMapString,Object());其他都没变,用的方法和ArrayList差不多。可以参考api文档。

  更多Java相关技术文章,请访问Java开发教程专栏学习!这就是数组列表线程安全的细节。更多请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: