arraylist为什么线程不安全(arraylist为什么线程不安全)
本文目录
- arraylist为什么线程不安全
- Java中HashMap,HashSet是线程安全的吗,ArrayList是线程不安全的那如何避免其出异常
- arraylist 线程安全的吗
- arraylist是线程安全的吗
arraylist为什么线程不安全
首先说一下什么是线程不安全:线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。 如图,List接口下面有两个实现,一个是ArrayList,另外一个是vector。 从源码的角度来看,因为Vector的方法前加了,synchronized 关键字,也就是同步的意思,sun公司希望Vector是线程安全的,而希望arraylist是高效的,缺点就是另外的优点。 说下原理(百度的,很好理解): 一个 ArrayList ,在添加一个元素的时候,它可能会有两步来完成:1. 在 Items 的位置存放此元素;2. 增大 Size 的值。在单线程运行的情况下,如果 Size = 0,添加一个元素后,此元素在位置 0,而且 Size=1;而如果是在多线程情况下,比如有两个线程,线程 A 先将元素存放在位置 0。但是此时 CPU 调度线程A暂停,线程 B 得到运行的机会。线程B也向此 ArrayList 添加元素,因为此时 Size 仍然等于 0 (注意哦,我们假设的是添加一个元素是要两个步骤哦,而线程A仅仅完成了步骤1),所以线程B也将元素存放在位置0。然后线程A和线程B都继续运行,都增加 Size 的值。那好,现在我们来看看 ArrayList 的情况,元素实际上只有一个,存放在位置 0,而 Size 却等于 2。这就是“线程不安全”了。示例程序:package test;import java.util.ArrayList;import java.util.List;public class ArrayListInThread implements Runnable {List《String》 list1 = new ArrayList《String》();// not thread safe// List《String》 list1 = Collections.synchronizedList(new ArrayList《String》());// thread safepublic void run() {try {Thread.sleep((int)(Math.random() * 2));}catch (InterruptedException e) {e.printStackTrace();}list1.add(Thread.currentThread().getName());}public static void main(String args) throws InterruptedException {ThreadGroup group = new ThreadGroup(“mygroup“);ArrayListInThread t = new ArrayListInThread();for (int i = 0; i 《 10000; i++) {Thread th = new Thread(group, t, String.valueOf(i));th.start();}while (group.activeCount() 》 0) {Thread.sleep(10);}System.out.println();System.out.println(t.list1.size()); // it should be 10000 if thread safe collection is used.}}
Java中HashMap,HashSet是线程安全的吗,ArrayList是线程不安全的那如何避免其出异常
HashMap,HashSet,ArrayList都不具备线程安全。
可以用
Set s=Collections.synchronizedSet(new Hashset《...》());Map m=Collections.synchronizedMap(new HashMap《...》());List l=Collections.synchronizedList(new ArrayList《...》());获得被同步后的版本。
也可以用ConcurrentHashMap等同步工具代替
arraylist 线程安全的吗
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。比如一个ArrayList类,在添加一个元素的时候,它可能会有两步来完成:1.在Items的位置存放此元素;2.增大Size的值。在单线程运行的情况下,如果Size=0,添加一个元素后,此元素在位置0,而且Size=1;而如果是在多线程情况下,比如有两个线程,线程A先将元素存放在位置0。但是此时CPU调度线程A暂停,线程B得到运行的机会。线程B也向此ArrayList添加元素,因为此时Size仍然等于0(注意哦,我们假设的是添加一个元素是要两个步骤哦,而线程A仅仅完成了步骤1),所以线程B也将元素存放在位置0。然后线程A和线程B都继续运行,都增加Size的值。那好,现在我们来看看ArrayList的情况,元素实际上只有一个,存放在位置0,而Size却等于2。这就是“线程不安全”了,呵呵。上面是找别人的,我也来补充一下:vector线程安全ArrayList非线程安全,但却解约系统性能
arraylist是线程安全的吗
不是线程安全的,与之对应的vector类是线程安全的,基本上都是在方法上加了synchronized。最通俗的解释就是:当多个线程同时操作一个类的时候,保证不出现数据错误问题,比如现在两个线程,一个先充值100,另一个消费50,假设原有的是100,那么最终的结果应该是150,如果出现线程安全问题的话,有可能第一个线程先读取到余额100,然后充值添加100, 此时另外一个线程读的也是100,但是减去50消费,这个时候,第一个线程准备写入数据,变成了200, 而第二个线程也写入数据,变成50,这个就是线程安全问题了ArrayList是线程不安全的类,如果你想用线程安全的,可以用Vector
更多文章:

python怎么读取txt文件(在python中如何调用txt文件中的某一列数据)
2025年3月17日 13:20

通配符怎么打出来(搜狗输入法,在电脑上打笔画,通配是哪个键)
2025年3月24日 19:00

udp协议和tcp协议的区别(如何通俗地解释TCP和UDP协议和HTTP、FTP、SMTP等协议之间的区别)
2025年2月28日 04:30

信号 signal(signal(信号)大结局什么意思,没看懂最后来的那帮人目的又是什么)
2025年3月8日 15:20

mysql配置超详细教程(mySQL装好需不需要在环境变量里配置,如何配置)
2025年3月29日 02:10

php声明数组(PHP中要使用数组的话必须先定义一个变量为array()吗)
2025年4月4日 15:10

ubuntu怎么安装第三方软件(ubuntu14.04怎么安装)
2025年3月3日 15:30

ug二次开发入门教程(UG二次开发 与C++动态链接 三维零件库)
2025年3月20日 01:00

话说为什么黑塔利亚里的cp好多人都萌ALL耀的?求aph all耀同人文,或者露中好茶菊耀,只要耀受的,别的CP不要
2025年2月20日 09:50