深表浅表拷贝
深表拷贝意指堆中的内容也会拷贝,浅表拷贝是指栈中内容拷贝(共享拷贝源的堆指针)。
JDK里面只是提供了浅拷贝,比如System.array.copy就是一例。如果想要实现深度拷贝需要将对象进行序列化,然后再进行反序列化获取对象,此时是深度拷贝。
但是既然JDK里面没有提供深度拷贝,那也意味着其实深度拷贝应用的场景也不是很多。比如我们碰到了一个例子:某个List是共享出去的多线程不安全,此时会有定时任务List进行遍历,然后将满足条件的元素进行删除。分析到此处有两类线程来操作该List:定时任务以及用户程序;实现机制是通过CopyOnWrite对象来对List内容进行浅表拷贝,获取一个新的栈对象,然后,发现不满足条件的,对原List进行删除。这样就避免了遍历删除异常。
其实采用Iterator的方式可以实现边遍历,边删除;两个线程对同时对一个队列又读又写还是不靠谱,现在各自操作各自的队列,影响最小。