• ArrayList线程不安全


    ArrayList线程不安全分析

    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中有多少个数据?不能确定吧!这就是不同步的结果,所以在多线程下不能保证数据按照你的意思进行处理,也就是线程不安全的。 

  • 相关阅读:
    LINUX核心命令实战总结七——文件备份与压缩命令
    LINUX核心命令实战总结六——信息显示与搜索文件命令
    LINUX核心命令实战总结五——文件过滤及内容编辑处理命令二
    LINUX核心命令实战总结四——文件过滤及内容编辑处理命令一
    LINUX核心命令实战总结三——文件和目录操作命令二
    LINUX核心命令实战总结二——文件和目录操作命令一
    LINUX核心命令实战总结一——关机、重启、注销命令
    python进阶十——mysql初识
    python进阶九——并发编程之协程
    入职培训第一天
  • 原文地址:https://www.cnblogs.com/antis/p/5287259.html
Copyright © 2020-2023  润新知