从JVM角度看看Java的clone操作

作者: 程序员北游 | 来源:发表于2019-06-07 20:22 被阅读13次

欢迎关注专栏:Java架构技术进阶。里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦。
最近在给熔断器组件增加一个降级策略(Hystrix好像没有这个配置),我们提供了如下几种策略:

1、默认策略

2、返回常量值

3、抛出指定异常

4、执行一段groovy脚本

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

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

从JVM角度看看Java的clone操作

今天发现,如果每次都返回同一个对象,而且这个逻辑对业务来说是黑盒(业务不知道每次拿到的对象是同一个),如果对这个对象进行了操作,那肯定会影响到其它的请求,为了避免背锅,我们需要每次返回一个新的对象,第一反应是通过clone是否可行(因为每次json的序列化也会损耗性能),但是jdk自带的clone方法只是浅克隆,如果对象中包含了另一个复杂对象,clone出来的对象还是存在被修改的风险。

大家可以看下面一个例子:

class Master {
 String name;
 public Master(String name) {
 this.name = name;
 }
}

初始化一个Master类

class Dog implements Cloneable {
 String name;
 int age;
 Master master;
 public Dog(String name, int age, Master master) {
 this.name = name;
 this.age = age;
 this.master = master;
 }
 @Override
 protected Object clone() throws CloneNotSupportedException {
 return super.clone();
 }
 @Override
 public String toString() {
 return "{name:" + name + ", age: " + age + ", master: "+ master.name + "}";
 }
}

再初始化一条狗

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

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

{name:旺财, age: 1, master: zj1}

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

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

从JVM角度看看Java的clone操作

以前一直没用过clone这个方法,通过源码发现在运行的时候会检查类是否实现Cloneable接口,编译的时候不检查,想啥呢?

根据对象或者数据的大小,从堆中开辟一块同等大小的内存,然后把原始对象的数据都复制到新的内存地址,对于基本类型,可以把原始值复制过来,但是对于内部对象来说,其保存的只是一个地址,复制时也是对地址的复制,最终还是指向同一个对象,所以就造成了上述的问题。

欢迎关注专栏:Java架构技术进阶。里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦。

相关文章

  • 从JVM角度看看Java的clone操作

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

  • 从JVM角度看看Java的clone操作

    欢迎关注专栏:Java架构技术进阶。里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦。最近在...

  • JVM运行时核心数据区域

    package JVM_app; /** * 从JVM调用的角度分析java程序对内存空间的使用; * 当JVM进...

  • JVM学习笔记

    JVM: java virtua Machine jdk中包含了jvm和“屏蔽操作系统差异的组件” jvm各个操作...

  • 漫谈jvm

    ## 背景介绍 jvm已经是Java开发的必备技能了,jvm相当于Java的操作系统。 JVM,java virt...

  • JVM内存管理

    1.JVM与操作系统的关系   JVM全称Java Virtual Machine(Java虚拟机)。JVM屏蔽了...

  • 高效并发

    从JVM的角度看一下Java与线程,内存模型,线程安全以及JVM对于锁的优化 硬件内存模型与JVM内存模型 硬件的...

  • JVM内存管理(一)

    JVM与操作系统的关系 1.JVM 基础 1.1 Java Virtual Machine是什么 ​ JVM ...

  • [Java]浅谈Java/JavaScript的一次编写,到处运

    一.Java跨平台的基础是JVM(Java Virtual Machine) JVM是一个软件,它基于不同的操作系...

  • JVM+JDK+JRE笔记

    一、java程序的生命周期 二、JVM JVM是实现java语音与平台无关性的关键 JVM负责与操作系统的交互,用...

网友评论

    本文标题:从JVM角度看看Java的clone操作

    本文链接:https://www.haomeiwen.com/subject/cfuvxctx.html