怎么通过JVM角度谈谈Java的克隆操作

  介绍

这篇文章将为大家详细讲解有关怎么通过JVM角度谈谈Java的克隆操作,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

<强>前言

最近在给熔断器组件增加一个降级策略(Hystrix好像没有这个配置),我们提供了如下几种策略:

1,默认策略

2,返回常量值

3,抛出指定异常

4,执行一段groovy脚本

当然了,这些配置都是可以在平台上配置,并立即生效的。

目前返回常量值的实现如下:

怎么通过JVM角度谈谈Java的克隆操作“> <br/> </p> <p>今天发现,如果每次都返回同一个对象,而且这个逻辑对业务来说是黑盒(业务不知道每次拿到的对象是同一个),如果对这个对象进行了操作,那肯定会影响到其它的请求,为了避免背锅,我们需要每次返回一个新的对象,第一反应是通过克隆是否可行(因为每次json的序列化也会损耗性能),但是jdk自带的克隆方法只是浅克隆,如果对象中包含了另一个复杂对象,克隆出来的对象还是存在被修改的风险。</p> <p> <强>详细介绍:</强> </p> <p>大家可以看下面一个例子:</p> <pre类= class  Master  {   ,String 名称;   ,public 主(String 名称),{   this.name 才能=,名称;   ,}   }

初始化一个主类

class  Dog  implements  Cloneable  {   ,String 名称;   ,int 年龄;   ,Master 主;      ,public 狗(名称、String  int 年龄,Master 主),{=,this.name 名称;=,this.age 年龄;=,this.master 主;   ,}      ,@Override   ,protected  Object 克隆(),throws  CloneNotSupportedException  {   ,return  super.clone ();   ,}      ,@Override   ,public  String  toString (), {   ,return “{名称:“,+,name  +,,,,年龄:,“,+,age  +,,,,主人:,“+,master.name  +,“}”;   ,}   }

再初始化一条狗

public  static  void  main (String [], args), throws  Exception  {   ,Master  Master =, new 主(“zj0");   ,Dog  dog1 =, new 狗(“旺财”,,1,,掌握);   ,Dog  dog2 =,(狗)dog1.clone ();=,dog1.name “比利“;=,dog1.master.name “zj1";   ,System.out.println (dog2);   }

最后运行一下,结果如下:

{名称:旺财,,年龄:,1日,大师:,zj1}

dog1是原始狗,dog2是克隆出来的,但是我修改dog1的主人的名字时,克隆的主人也跟着变化了,这显然不行。

虽然一直都知道对象的克隆方法是浅克隆,也一直没继续探索一下,今天碰到了就顺手看下JVM的实现,好像很简单,在jvm.cpp文件中,搜索“JVM_Clone"

怎么通过JVM角度谈谈java的克隆操作“> <br/> </p> <p>以前一直没用过克隆这个方法,通过源码发现在运行的时候会检查类是否实现可克隆接口,编译的时候不检查,想啥呢? </p> <p>根据对象或者数据的大小,从堆中开辟一块同等大小的内存,然后把原始对象的数据都复制到新的内存地址,对于基本类型,可以把原始值复制过来,但是对于内部对象来说,其保存的只是一个地址,复制时也是对地址的复制,最终还是指向同一个对象,所以就造成了上述的问题。</p> <p class=关于“怎么通过JVM角度谈谈java的克隆操作”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看的到。

怎么通过JVM角度谈谈Java的克隆操作