最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何通過JVM角度談?wù)凧ava的clone操作

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

前言

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

1、默認(rèn)策略

2、返回常量值

3、拋出指定異常

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

當(dāng)然了,這些配置都是可以在平臺(tái)上配置,并立即生效的。

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


今天發(fā)現(xiàn),如果每次都返回同一個(gè)對(duì)象,而且這個(gè)邏輯對(duì)業(yè)務(wù)來(lái)說是黑盒(業(yè)務(wù)不知道每次拿到的對(duì)象是同一個(gè)),如果對(duì)這個(gè)對(duì)象進(jìn)行了操作,那肯定會(huì)影響到其它的請(qǐng)求,為了避免背鍋,我們需要每次返回一個(gè)新的對(duì)象,第一反應(yīng)是通過clone是否可行(因?yàn)槊看蝚son的序列化也會(huì)損耗性能),但是jdk自帶的clone方法只是淺克隆,如果對(duì)象中包含了另一個(gè)復(fù)雜對(duì)象,clone出來(lái)的對(duì)象還是存在被修改的風(fēng)險(xiǎn)。

詳細(xì)介紹:

大家可以看下面一個(gè)例子:

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

初始化一個(gè)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("旺財(cái)", 1, master);
 Dog dog2 = (Dog)dog1.clone();
 dog1.name = "比利";
 dog1.master.name = "zj1";
 System.out.println(dog2);
} 

最后運(yùn)行一下,結(jié)果如下:

{name:旺財(cái), age: 1, master: zj1}

dog1是原始狗,dog2是克隆出來(lái)的,但是我修改dog1的master的name時(shí),克隆的master也跟著變化了,這顯然不行。

雖然一直都知道Object的clone方法是淺克隆,也一直沒繼續(xù)探索一下,今天碰到了就順手看下JVM的實(shí)現(xiàn),好像很簡(jiǎn)單,在jvm.cpp文件中,搜索"JVM_Clone"


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

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

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • 老生常談Java中List與ArrayList的區(qū)別

    老生常談Java中List與ArrayList的區(qū)別

    大家都知道List是接口,ArrayList是List接口的一個(gè)實(shí)現(xiàn)類,接下來(lái)通過本文給大家介紹Java中List與ArrayList的區(qū)別,需要的朋友可以參考下
    2022-08-08
  • 新聞列表的分頁(yè)查詢java代碼實(shí)現(xiàn)

    新聞列表的分頁(yè)查詢java代碼實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了新聞列表的分頁(yè)查詢java代碼實(shí)現(xiàn),感興趣的小伙伴們可以參考一下
    2016-08-08
  • springboot解決Class path contains multiple SLF4J bindings問題

    springboot解決Class path contains multiple 

    這篇文章主要介紹了springboot解決Class path contains multiple SLF4J bindings問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • SpringBoot啟動(dòng)時(shí)如何修改上下文

    SpringBoot啟動(dòng)時(shí)如何修改上下文

    本文介紹了如何在Spring Boot啟動(dòng)時(shí)修改上下文,以便加載封裝JAR中的國(guó)際化文件,通過在resources目錄下的META-INF文件夾中的spring.factories文件中配置指定類,可以實(shí)現(xiàn)這一功能
    2024-11-11
  • Java中定時(shí)器Timer和TimerTask使用方法全解析

    Java中定時(shí)器Timer和TimerTask使用方法全解析

    這篇文章主要介紹了Java中定時(shí)器Timer和TimerTask使用方法的相關(guān)資料,如何創(chuàng)建定時(shí)任務(wù)、安排任務(wù)執(zhí)行、取消任務(wù)以及實(shí)現(xiàn)任務(wù)的暫停和恢復(fù)功能,通過這些功能,可以靈活地控制任務(wù)的執(zhí)行,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • SpringCloud Feign的使用代碼實(shí)例

    SpringCloud Feign的使用代碼實(shí)例

    這篇文章主要介紹了SpringCloud Feign的使用代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 注解、原生Spring、SchemaBased三種方式實(shí)現(xiàn)AOP代碼案例

    注解、原生Spring、SchemaBased三種方式實(shí)現(xiàn)AOP代碼案例

    這篇文章主要介紹了注解、原生Spring、SchemaBased三種方式實(shí)現(xiàn)AOP的方法介紹,文中有詳細(xì)的代碼示例,對(duì)我們的學(xué)習(xí)有一定的幫助,需要的朋友可以參考下
    2023-06-06
  • SpringBoot2新特性 自定義端點(diǎn)詳解

    SpringBoot2新特性 自定義端點(diǎn)詳解

    這篇文章主要介紹了SpringBoot2新特性 自定義端點(diǎn)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • IDEA中的打包Build Artifacts圖文詳解

    IDEA中的打包Build Artifacts圖文詳解

    當(dāng)項(xiàng)目開發(fā)完畢,需要對(duì)外發(fā)布時(shí),我們就會(huì)用到IDEABuild Artifacts功能,那么如果在idea中打包呢,這篇文章主要介紹了IDEA中的打包Build Artifacts詳解,需要的朋友可以參考下
    2024-03-03
  • Java網(wǎng)絡(luò)編程教程之設(shè)置請(qǐng)求超時(shí)的方法

    Java網(wǎng)絡(luò)編程教程之設(shè)置請(qǐng)求超時(shí)的方法

    這篇文章主要給大家介紹了關(guān)于Java網(wǎng)絡(luò)編程教程之設(shè)置請(qǐng)求超時(shí)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12

最新評(píng)論

长葛市| 五寨县| 沁阳市| 河池市| 清远市| 武夷山市| 彩票| 哈尔滨市| 花莲县| 荔波县| 阿城市| 汝城县| 石首市| 虎林市| 平山县| 鄂伦春自治旗| 游戏| 城步| 吕梁市| 怀宁县| 绵竹市| 沈丘县| 沅江市| 株洲市| 湖州市| 津南区| 开鲁县| 涟源市| 邯郸县| 博野县| 丹寨县| 南平市| 榆树市| 巴楚县| 通许县| 盐源县| 泗洪县| 贵定县| 囊谦县| 广水市| 吴旗县|