博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ArrayList线程不安全
阅读量:5299 次
发布时间:2019-06-14

本文共 1528 字,大约阅读时间需要 5 分钟。

http://wsmajunfeng.iteye.com/blog/1493941
 

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

1. 在 Items[Size] 的位置存放此元素;
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。这就是“线程不安全”了。
线程不安全的例子:

public class ArrayListInThread implements Runnable {

    List<String> list1 = new ArrayList<String>(1);// not thread safe
//    List<String> list1 = Collections.synchronizedList(new ArrayList<String>());// thread safe
    public 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("testgroup");
        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.
    }
}

Vector线程安全

Vector的所有操作方法都被同步了,既然被同步了,多个线程就不可能同时访问vector中的数据,只能一个一个地访问,所以不会出现数据混乱的情况,所以是线程安全的。

如果不同步的话,对于同一个vector实例,如果第一个线程添加一个数据进去,第二个线程删除一个数据,你说最终结果是vector中有多少个数据?不能确定吧!这就是不同步的结果,所以在多线程下不能保证数据按照你的意思进行处理,也就是线程不安全的。 

转载于:https://www.cnblogs.com/antis/p/5287259.html

你可能感兴趣的文章
Linux下安装PHP遇到的各种问题
查看>>
transition
查看>>
shell脚本自动备份数据库(精简版)
查看>>
充分发挥FPGA优势 Altera首推新颖OpenCL工具
查看>>
ORA-12520: TNS: 监听程序无法为请求的服务器类型找到可用的处理程序
查看>>
ORACLE手工删除数据库
查看>>
LCD 1602A
查看>>
自然语言处理(四)——一个完整的训练程序
查看>>
ecshop smarty 行号
查看>>
SAS的初级入门(四)
查看>>
node.js上传文件
查看>>
duobango-tinyNET,20121219,[unsigned unicast:1;]
查看>>
设计模式学习---工厂模式
查看>>
Histogram of Oriented Gridients(HOG) 方向梯度直方图
查看>>
Flask,ORM及模板引擎Jinja2
查看>>
一 Android Studio 打包Egret App
查看>>
php注册和登陆与数据库的链接
查看>>
jQuery选择器
查看>>
百度地图采集
查看>>
vmstat命令
查看>>