在CopyOnWriteArrayList
的情况下,只要将元素添加到集合中就会创建一个新对象。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
你是什么意思_a将创建一个新的对象,并且'playersUsing2'参考stack_? –
我认为你误解了语句_ java.util.ArrayList'的线程安全变体,其中所有可变操作(add,set等)都是通过创建**底层数组的新副本来实现的* * ._ –
@SotiriosDelimanolis但是为什么每次变更操作之后我都会看到一个新的hashcode值。我添加了run的o/p。 – hagrawal