文
章
目
录
章
目
录
ArrayList是一个非同步集合,不应在并发环境中使用,除非进行显式同步。要同步一个ArrayList,我们可以使用两个JDK提供的方法。
1.使用Collections.synchronizedList()方法
Collections.synchronizedList()方法返回一个由指定列表支持的同步列表。
List syncList = Collections.synchronizedList(arraylist);
- 建议在通过Iterator、Spliterator或Stream遍历返回的列表时手动同步列表,否则可能导致非确定性行为。
- 不需要对这个同步ArrayList进行显式同步以添加或删除元素。
List<String> namesList = Collections.synchronizedList(new ArrayList<String>());
//List 方法是同步的
namesList.add("Alex");
namesList.add("Brian");
//在迭代时使用显式同步
synchronized(namesList)
{
Iterator<String> iterator = namesList.iterator();
while (iterator.hasNext())
{
System.out.println(iterator.next());
}
}
程序输出:
Alex
Brian
2.使用CopyOnWriteArrayList
CopyOnWriteArrayList是ArrayList的线程安全变体,其中所有可变操作(添加、设置等)是通过创建底层数组的新副本来实现的。当我们不能或不想同步ArrayList的遍历时,这个类非常有用。它是线程安全的Java集合的一部分。
CopyOnWriteArrayList类使用”快照”风格的迭代器方法。它在创建迭代器时使用对底层数组状态的引用。在迭代器的生命周期内,底层数数组永远不会更改。
- 迭代器不会反映自创建迭代器以来列表的添加、删除或更改。
- 不支持迭代器本身的元素更改操作(删除、设置和添加)。
OnWriteArrayList<String> namesList = new CopyOnWriteArrayList<String>();
//List 方法是同步的
namesList.add("Alex");
namesList.add("Brian");
//在迭代过程中不需要显式同步
Iterator<String> iterator = namesList.iterator();
while (iterator.hasNext())
{
System.out.println(iterator.next());
}
程序输出:
Alex
Brian
以上就是Java中的同步ArrayList的全部内容。