📅  最后修改于: 2023-12-03 15:02:03.725000             🧑  作者: Mango
Java中的 synchronizedList()
方法用于创建一个线程安全的列表,可以避免多线程下的并发访问造成的数据冲突问题。
该方法返回一个由指定列表支持的同步(线程安全)的列表。
public static <T> List<T> synchronizedList(List<T> 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()
方法,可以将一个普通的列表包装为线程安全的列表。该方法返回的线程安全列表,在多线程环境下是安全的,并发访问不会导致数据冲突问题。