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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。