Java中的不安全集合类(一)

常用的线程不安全集合:
ArrayList
LinkedList
ArraySet
HashMap

线程不安全:

比如当A线程在操作数据时,B线程突然进来,A线程要添加的位置占用,后续A线程将此数据(B线程的数据)修改为自己的数据这时就会空值(java.lang.NullPointerException) 或者是抛出异常(java.util.ConcurrentModificationException)
JAVA版本:1.8

ArrayList 示例:

我们使用 15 个线程同时向 List 接口下 ArrayList 集合 中添加数据:

    public static void main(String[] args) {
        //新建一个ArrayList集合 strings
        List<String> strings = new ArrayList<>();
        //循环创建线程 向strings中添加数据
        for (int i = 1; i <= 15; i++) {
            new Thread(() -> {
                strings.add(UUID.randomUUID().toString().substring(0, 5));
                System.out.println(Thread.currentThread().getName()+":"+strings);
            },String.valueOf(i)).start();
        }
    }

执行后我们看到:

Exception in thread "2" Exception in thread "5" java.util.ConcurrentModificationException

线程"2" 与 线程 “5” 抛出异常:
java.util.ConcurrentModificationException (并发修改异常)

我们来看 ArrayList 的add() 方法源码一步步解析

    /**
     * Appends the specified element to the end of this list.
     *
     * @param e element to be appended to this list
     * @return <tt>true</tt> (as specified by {@link Collection#add})
     */
    public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }

ArrayLisrt 底层 为一个数组
首先更新了 数组的长度,然后将我们的属性赋给指定的数组下标
故:ArrayList 为线程不安全集合


LinkedList 示例:

我们使用 15 个线程同时向 List 接口下 LinkedList 集合 中添加数据:

List<String> strings = new LinkedList<>();

执行后我们看到:

Exception in thread "12" Exception in thread "4" java.lang.NullPointerException

超过一半的线程抛出:
java.lang.NullPointerException (空指针异常)

我们来看 LinkedList 的add() 方法源码一步步解析

public boolean add(E e) {
        linkLast(e);
        return true;
    }
     /**
     * Links e as last element.
     */
    void linkLast(E e) {
        final Node<E> l = last;
        final Node<E> newNode = new Node<>(l, e, null);
        last = newNode;
        if (l == null)
            first = newNode;
        else
            l.next = newNode;
        size++;
        modCount++;
    }

LinkedList 底层是基于双向链表实现的,也是实现了 List 接口,所以也拥有 List 的一些特点
可见每次插入都是移动指针
故:LinkedList 为线程不安全集合

如何解决线程不安全问题请查看

Java中的不安全集合类(二)
本人小白,如有编写不合理的地方请大神指点,轻喷

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java,有几个线程安全集合类可以用于多线程环境下的操作。其包括Vector、Stack、HashTable等。这些集合类通过使用Synchronized来保证线程安全性。不过需要注意的是,官方已经标注Vector和HashTable为即将废弃的类,不建议使用它们。 除了上述的线程安全集合类,还有其他一些较新的线程安全集合类可以使用。其包括CopyOnWriteArrayList、CopyOnWriteArraySet和ConcurrentHashMap等。这些集合类通过特定的机制来实现线程安全性,而且在性能方面也进行了优化。 此外,Java还有Queue接口,它包含了几个线程安全的实现类,如ConcurrentLinkedQueue和BlockingQueue接口的实现类。这些集合类可以在多线程环境下进行安全的队列操作。 总之,在Java有多种线程安全集合类可供选择,可以根据具体的需求和场景选择合适的集合类来保证线程安全性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Java那些线程安全集合类](https://blog.csdn.net/weixin_53946852/article/details/122801143)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Java线程安全的集合](https://blog.csdn.net/weixin_42601136/article/details/107108818)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值