• 技术文章 >Java >java教程

    arraylist线程安全吗

    (*-*)浩(*-*)浩2019-06-05 11:58:43原创7031
    什么是线程不安全:

    线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。

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

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

    2. 增大 Size 的值。 (推荐学习:Java视频教程

    在单线程运行的情况下,如果 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;
     
    importjava.util.ArrayList;
     
    import java.util.List;
    public class ArrayListInThread implements Runnable{
        List<String> list1 = new ArrayList<String>();// not thread safe
        publicvoid 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 safecollection is used.
        }
    }

    如何解决线程不安全?

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

    二:使用Collections.synchronizedList();使用方法如下:

    假如你创建的代码如下:List<Map<String,Object>>data=new ArrayList<Map<String,Object>>();

    那么为了解决这个线程安全问题你可以这么使用Collections.synchronizedList(),如:

    List<Map<String,Object>> data=Collections.synchronizedList(newArrayList<Map<String,Object>>());

    其他的都没变,使用的方法也几乎与ArrayList一样,大家可以参考下api文档;

    更多Java相关技术文章,请访问Java开发教程栏目进行学习!

    以上就是arraylist线程安全吗的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:arraylist
    上一篇:选择排序和冒泡排序的区别 下一篇:Java的八大基本数据类型
    PHP编程就业班

    相关文章推荐

    • Java集合之实现类ArrayList与LinkedList的方法• java中的List:ArrayList、LinkedList实现接口的简单介绍• Java并发编程:并发容器CopyOnWriteArrayList的实现原理• linkedlist和arraylist的区别是什么

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网