📜  Java中的集合 synchronizedList() 方法及示例(1)

📅  最后修改于: 2023-12-03 15:02:03.725000             🧑  作者: Mango

Java中的集合 synchronizedList() 方法及示例

介绍

Java中的 synchronizedList() 方法用于创建一个线程安全的列表,可以避免多线程下的并发访问造成的数据冲突问题。

该方法返回一个由指定列表支持的同步(线程安全)的列表。

方法签名
public static <T> List<T> synchronizedList(List<T> list)
参数说明
  • list:指定的列表
示例代码

下面我们来看一个示例代码,首先创建一个普通的列表,随后使用 synchronizedList() 方法将其包装为线程安全的列表。

import java.util.*;

public class SynchronizedListExample {

    public static void main(String[] args) {
        // 创建一个普通的列表
        List<Integer> list = new ArrayList<>();

        // 添加数据到列表中
        list.add(1);
        list.add(2);
        list.add(3);

        // 使用synchronizedList()方法将列表增强为线程安全的
        List<Integer> synchronizedList = Collections.synchronizedList(list);

        // 创建线程1,向列表中添加数据
        Thread t1 = new Thread(() -> {
            synchronized (synchronizedList) {
                System.out.println("Thread1 添加数据 4 5 6");
                synchronizedList.add(4);
                synchronizedList.add(5);
                synchronizedList.add(6);
            }
        });

        // 创建线程2,向列表中添加数据
        Thread t2 = new Thread(() -> {
            synchronized (synchronizedList) {
                System.out.println("Thread2 添加数据 7 8 9");
                synchronizedList.add(7);
                synchronizedList.add(8);
                synchronizedList.add(9);
            }
        });

        // 启动线程1和线程2,模拟并发添加数据
        t1.start();
        t2.start();

        // 等待线程1和线程2执行完成
        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 输出线程安全的列表
        System.out.println("线程安全的列表为:" + synchronizedList);
    }
}

以上代码中,我们使用 ArrayList 创建了一个普通的列表,并向其中添加了数据 1、2、3。

接着,使用 Collections.synchronizedList() 方法将其包装为线程安全的列表。

随后,我们创建了两个线程,并分别向线程安全的列表中添加数据 4、5、6 和 7、8、9。

最后,我们输出线程安全的列表,可以看到通过在添加数据时加上同步锁,避免了多线程访问导致的数据冲突问题。

输出结果如下:

Thread2 添加数据 7 8 9
Thread1 添加数据 4 5 6
线程安全的列表为:[1, 2, 3, 4, 5, 6, 7, 8, 9]
总结

使用 synchronizedList() 方法,可以将一个普通的列表包装为线程安全的列表。该方法返回的线程安全列表,在多线程环境下是安全的,并发访问不会导致数据冲突问题。