真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么通過(guò)JVM角度談?wù)凧ava的clone操作

這篇文章將為大家詳細(xì)講解有關(guān)怎么通過(guò)JVM角度談?wù)凧ava的clone操作,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括溫江網(wǎng)站建設(shè)、溫江網(wǎng)站制作、溫江網(wǎng)頁(yè)制作以及溫江網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,溫江網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到溫江省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

前言

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

1、默認(rèn)策略

2、返回常量值

3、拋出指定異常

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

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

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

怎么通過(guò)JVM角度談?wù)凧ava的clone操作

今天發(fā)現(xiàn),如果每次都返回同一個(gè)對(duì)象,而且這個(gè)邏輯對(duì)業(yè)務(wù)來(lái)說(shuō)是黑盒(業(yè)務(wù)不知道每次拿到的對(duì)象是同一個(gè)),如果對(duì)這個(gè)對(duì)象進(jìn)行了操作,那肯定會(huì)影響到其它的請(qǐng)求,為了避免背鍋,我們需要每次返回一個(gè)新的對(duì)象,第一反應(yīng)是通過(guò)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"

怎么通過(guò)JVM角度談?wù)凧ava的clone操作

以前一直沒用過(guò)clone這個(gè)方法,通過(guò)源碼發(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ù)制過(guò)來(lái),但是對(duì)于內(nèi)部對(duì)象來(lái)說(shuō),其保存的只是一個(gè)地址,復(fù)制時(shí)也是對(duì)地址的復(fù)制,最終還是指向同一個(gè)對(duì)象,所以就造成了上述的問(wèn)題。

關(guān)于“怎么通過(guò)JVM角度談?wù)凧ava的clone操作”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。


分享文章:怎么通過(guò)JVM角度談?wù)凧ava的clone操作
文章分享:http://weahome.cn/article/jpsshd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部