服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Java中ArrayList同步的2种方法分享

Java中ArrayList同步的2种方法分享

2022-10-08 15:10小锋学长生活大爆炸 Java教程

这篇文章主要分享了Java中ArrayList同步的2种方法,Collections.synchronizedList()的方法,这个方法要进行串行访问以及使用CopyOnWriteArrayList,下面分享内容需要的小伙伴可以参考一下

前言:

        arrayList 的实现是默认不同步的。这意味着如果一个线程在结构上修改它并且多个线程同时访问它,它必须在外部同步。结构修改意味着从列表中添加或删除元素或显式调整后备数组的大小。改变现有元素的值不是结构修改。

有两种方法可以创建同步Arraylist:

  • 1. Collections.synchronizedList() 方法。
  • 2. 使用 CopyOnWriteArrayList。

方法1:使用 Collections.synchronizedList() 方法

        要进行串行访问,必须通过返回列表完成对后备列表的所有访问。

        在迭代返回的列表时,用户必须手动同步它。因为在执行add()等方法的时候是加了synchronized关键字的,但是iterator()却没有加。所以在使用的时候需要加上synchronized

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// Java program to demonstrate working of
// Collections.synchronizedList
import java.util.*;
 
class GFG
{
    public static void main (String[] args)
    {
        List<String> list =
        Collections.synchronizedList(new ArrayList<String>());
 
        list.add("practice");
        list.add("code");
        list.add("quiz");
 
        synchronized(list)
        {
            // must be in synchronized block
            Iterator it = list.iterator();
 
            while (it.hasNext())
                System.out.println(it.next());
        }
    }
}

方法 2:使用 CopyOnWriteArrayList

        ArrayList 的线程安全变体,其中所有可变操作(例如添加、设置、删除...)都是通过创建底层数组的单独副本来实现的。它通过创建 List 的单独副本来实现线程安全,这与 vector 或其他集合用于提供线程安全的方式不同。

  • 当我们不能或不想同步遍历,但需要防止并发线程之间的干扰时,它很有用。
  • 这是昂贵的,因为每次写入操作都涉及单独的数组副本(例如添加,设置,删除......)
  • 当你有List并且需要遍历它的元素并且不经常修改它时,它是非常有效的。

        即使在创建迭代器后修改了 copyOnWriteArrayList,迭代器也不会抛出ConcurrentModificationException,因为迭代器正在迭代 ArrayList 的单独副本,而写操作正在 ArrayList 的另一个副本上发生。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// Java program to illustrate the thread-safe ArrayList.
import java.io.*;
import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArrayList;
 
class GFG
{
    public static void main (String[] args)
    {
        // creating a thread-safe Arraylist.
        CopyOnWriteArrayList<String> threadSafeList
            = new CopyOnWriteArrayList<String>();
 
        // Adding elements to synchronized ArrayList
        threadSafeList.add("geek");
        threadSafeList.add("code");
        threadSafeList.add("practice");
 
        System.out.println("Elements of synchronized ArrayList :");
 
        // Iterating on the synchronized ArrayList using iterator.
        Iterator<String> it = threadSafeList.iterator();
 
        while (it.hasNext())
            System.out.println(it.next());
    }
}

如果我们尝试通过迭代器自己的方法修改 CopyOnWriteArrayList 会发生什么?

        如果您尝试通过迭代器自己的方法(例如 add()、set()、remove())修改CopyOnWriteArrayList,它会抛出 UnsupportedOperationException 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// Java program to illustrate the thread-safe ArrayList
import java.io.*;
import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArrayList;
 
class GFG
{
    public static void main (String[] args)
    {
        // creating a thread-safe Arraylist.
        CopyOnWriteArrayList<String> threadSafeList =
            new CopyOnWriteArrayList<String>();
 
        // Adding elements to synchronized ArrayList
        threadSafeList.add("geek");
        threadSafeList.add("code");
        threadSafeList.add("practice");
 
        System.out.println("Elements of synchronized ArrayList :");
 
        // Iterating on the synchronized ArrayList using iterator.
        Iterator<String> it = threadSafeList.iterator();
 
        while (it.hasNext())
        {
            String str = it.next();
            it.remove();
        }
    }
}

CopyOnWriteArrayList 的其他构造函数:

  • 1. CopyOnWriteArrayList(Collection<? extends E> c):创建一个包含指定集合元素的列表,按照集合迭代器返回的顺序。
  • 2. CopyOnWriteArrayList(E[] toCopyIn):创建一个包含给定数组副本的列表。

向量同步时为什么要使用arrayList?

  • 性能: Vector 是同步和线程安全的,因此,它比 ArrayList 稍慢。
  • 功能: Vector 在每个单独的操作级别进行同步。通常,程序员喜欢同步整个操作序列。同步单个操作既不安全又慢。
  • Vectors obsolete:向量被认为是过时的,并且在 java 中被非正式地弃用。此外,vector 对几乎从未完成的每个单独操作进行同步。大多数java程序员更喜欢使用ArrayList,因为如果他们需要进行同步,他们可能无论如何都会显式地同步arrayList。

以下是 Java 中 ArrayList CopyOnWriteArrayList 类之间的显着差异。

  数组列表 复制写入数组列表
同步 ArrayList 不同步。 CopyOnWriteArrayList 是同步的。
线程安全 ArrayList 不是线程安全的。 CopyOnWriteArrayList 是线程安全的。
迭代器类型 ArrayList 迭代器是快速失败的,如果在迭代过程中发生并发修改,则 ArrayList 会抛出 ConcurrentModificationException。 CopyOnWriteArrayList 是故障安全的,它在迭代过程中永远不会抛出 ConcurrentModificationException。其背后的原因是 CopyOnWriteArrayList 每次修改时都会创建一个新的数组列表。
删除操作 ArrayList 迭代器支持在迭代过程中移除元素。 如果在迭代期间尝试删除元素,则 CopyOnWriteArrayList.remove() 方法会引发异常。
表现 ArrayList 更快。 CopyOnWriteArrayList 比 ArrayList 慢。
从 Java 版本开始 1.2 1.5

到此这篇关于Java中ArrayList同步的2种方法分享的文章就介绍到这了,更多相关Java中ArrayList同步内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://xfxuezhang.blog.csdn.net/article/details/120337487

延伸 · 阅读

精彩推荐
  • Java教程startActivityForResult和setResult案例详解

    startActivityForResult和setResult案例详解

    这篇文章主要介绍了startActivityForResult和setResult案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    Cynthia&Sky10352021-11-21
  • Java教程swing jtextArea滚动条和文字缩放效果

    swing jtextArea滚动条和文字缩放效果

    这篇文章主要为大家详细介绍了swing jtextArea滚动条和文字缩放效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    _Thomas8022021-03-10
  • Java教程浅谈Java线程Thread之interrupt中断解析

    浅谈Java线程Thread之interrupt中断解析

    这篇文章主要介绍了Java线程Thread之interrupt中断解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Ihesong4802021-03-28
  • Java教程Java中JSONObject与JSONArray的使用区别详解

    Java中JSONObject与JSONArray的使用区别详解

    这篇文章主要介绍了Java中JSONObject与JSONArray的使用区别详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    爱生活,爱编程4892021-01-30
  • Java教程java使用dom4j操作xml示例代码

    java使用dom4j操作xml示例代码

    dom4j是一个Java的XML API,类似于jdom,用来读写XML文件,下面我来个小例子学习他的使用方法 ...

    java教程网4172019-10-22
  • Java教程java实现屏蔽词功能

    java实现屏蔽词功能

    这篇文章主要介绍了java实现屏蔽词功能,类似贴吧里面屏蔽各种用户的发帖内容,感兴趣的小伙伴们可以参考一下 ...

    xiaojimanman7042020-03-19
  • Java教程SpringCloud Zuul基本使用方法汇总

    SpringCloud Zuul基本使用方法汇总

    这篇文章主要介绍了SpringCloud Zuul基本使用方法汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参...

    一马平川15272020-09-10
  • Java教程IDEA开启Run Dashboard的配置详解

    IDEA开启Run Dashboard的配置详解

    这篇文章主要介绍了IDEA开启Run Dashboard的配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下...

    脚印6202020-06-15