欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何通過JVM角度談談Java的clone操作

 更新時間:2018年06月21日 11:20:30   作者:占小狼  
java中僅有的創(chuàng)建對象的兩種方式:①.使用new操作符創(chuàng)建對象;②.使用clone方法復制對象。下面這篇文章主要通過JVM角度給大家詳細談談Java的clone操作的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下

前言

最近在給熔斷器組件增加一個降級策略(Hystrix好像沒有這個配置),我們提供了如下幾種策略:

1、默認策略

2、返回常量值

3、拋出指定異常

4、執(zhí)行一段groovy腳本

當然了,這些配置都是可以在平臺上配置,并立即生效的。

目前返回常量值的實現(xiàn)如下:


今天發(fā)現(xiàn),如果每次都返回同一個對象,而且這個邏輯對業(yè)務來說是黑盒(業(yè)務不知道每次拿到的對象是同一個),如果對這個對象進行了操作,那肯定會影響到其它的請求,為了避免背鍋,我們需要每次返回一個新的對象,第一反應是通過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方法是淺克隆,也一直沒繼續(xù)探索一下,今天碰到了就順手看下JVM的實現(xiàn),好像很簡單,在jvm.cpp文件中,搜索"JVM_Clone"


以前一直沒用過clone這個方法,通過源碼發(fā)現(xiàn)在運行的時候會檢查類是否實現(xiàn)Cloneable接口,編譯的時候不檢查,想啥呢?

根據(jù)對象或者數(shù)據(jù)的大小,從堆中開辟一塊同等大小的內存,然后把原始對象的數(shù)據(jù)都復制到新的內存地址,對于基本類型,可以把原始值復制過來,但是對于內部對象來說,其保存的只是一個地址,復制時也是對地址的復制,最終還是指向同一個對象,所以就造成了上述的問題。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

  • SpringBoot項目實現(xiàn)jar包方式打包部署

    SpringBoot項目實現(xiàn)jar包方式打包部署

    SpringBoot默認的打包方式就是jar包,本文就來介紹一下SpringBoot項目實現(xiàn)jar包方式打包部署,具有一定的參考價值,感興趣的可以了解一下
    2024-08-08
  • 淺析如何將多個SpringBoot項目打包到一個Docker容器中

    淺析如何將多個SpringBoot項目打包到一個Docker容器中

    在現(xiàn)代軟件開發(fā)中,Docker已成為一種流行的容器化技術,能夠簡化應用的部署和管理,本文將詳細介紹如何將多個Spring Boot項目打包到一個Docker容器中,希望對大家有所幫助
    2024-10-10
  • java性能優(yōu)化之代碼緩存優(yōu)化

    java性能優(yōu)化之代碼緩存優(yōu)化

    這篇文章主要介紹了java性能優(yōu)化之代碼緩存優(yōu)化,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07
  • 淺析Java?BigDecimal為什么可以不丟失精度

    淺析Java?BigDecimal為什么可以不丟失精度

    在金融領域,為了保證數(shù)據(jù)的精度,往往會使用BigDecimal,所以這篇文章主要來和大家探討下為什么BigDecimal可以保證精度不丟失,感興趣的可以了解下
    2024-03-03
  • IDEA main主函數(shù)如何添加args變量

    IDEA main主函數(shù)如何添加args變量

    這篇文章主要介紹了IDEA main主函數(shù)如何添加args變量,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-12-12
  • Java輸出數(shù)組的3種方法

    Java輸出數(shù)組的3種方法

    這篇文章主要給大家介紹了關于Java輸出數(shù)組的3種方法,對于初學者來說,數(shù)組的輸入輸出是一個麻煩的問題,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • mybatis注解與xml常用語句匯總

    mybatis注解與xml常用語句匯總

    最近一直在用mybatis,由于需要使用到了動態(tài)sql,遇到了一些問題,現(xiàn)在來總結一下,經驗教訓。下面這篇文章主要給大家總結介紹了mybatis注解與xml常用語句的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-09-09
  • Java集合功能與用法實例詳解

    Java集合功能與用法實例詳解

    這篇文章主要介紹了Java集合功能與用法,結合實例形式詳細分析了java集合的基本概念、功能、原理、操作技巧與使用注意事項,需要的朋友可以參考下
    2020-04-04
  • Spring IOC與DI核心重點分析

    Spring IOC與DI核心重點分析

    IOC也是Spring的核心之一了,之前學的時候是采用xml配置文件的方式去實現(xiàn)的,后來其中也多少穿插了幾個注解,但是沒有說完全采用注解實現(xiàn)。那么這篇文章就和大家分享一下,全部采用注解來實現(xiàn)IOC + DI
    2022-10-10
  • Java SpringBoot 使用攔截器作為權限控制的實現(xiàn)方法

    Java SpringBoot 使用攔截器作為權限控制的實現(xiàn)方法

    這篇文章主要介紹了Java SpringBoot 使用攔截器作為權限控制的實現(xiàn),文中通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-10-10

最新評論