在 的情况下CopyOnWriteArrayList
,只要将元素添加到集合中,就会创建一个新对象。
考虑下面的例子:
private static void copyOnWriteArrayList() {
List<String> playersUsing2 = new CopyOnWriteArrayList<String>();
System.out.println("Original hashCode = " + playersUsing2.hashCode());
playersUsing2.add("a1");
System.out.println("After a1 hashCode = " + playersUsing2.hashCode() + " size = " + playersUsing2.size());
addElement(playersUsing2, "a2");
System.out.println("After b1 from copyOnWriteArrayList hashCode = " + playersUsing2.hashCode() + " size = " + playersUsing2.size());
playersUsing2.add("b1");
System.out.println("After b1 hashCode = " + playersUsing2.hashCode() + " size = " + playersUsing2.size());
}
private static void addElement(List<String> playersUsingNew, String value) {
playersUsingNew.add(value);
System.out.println("After a2 hashCode = " + playersUsingNew.hashCode() + " size = " + playersUsingNew.size());
}
每次添加元素时,都会创建一个新对象,并且playersUsing2
堆栈上的引用将更新为指向该内存位置。可以理解。
现在,我传递playersUsing2
给另一个方法,因此将创建一个新的堆栈帧,并且playersUsingNew
还将指向相同的内存位置。并且当添加新元素时,将创建一个新对象并将playersUsingNew
指向新的内存位置。
但是如何playersUsing2
更新第一个堆栈帧以指向最新的内存位置?
我看到了java.util.concurrent.CopyOnWriteArrayList.add(E)
实现,但无法理解。是不是通过一些本机代码和JVM来处理,它是怎么发生的?
输出:
Original hashCode = 1
After a1 hashCode = 3087 size = 1
After a2 hashCode = 98754 size = 2
After b1 from copyOnWriteArrayList hashCode = 98754 size = 2
After b1 hashCode = 3064461 size = 3