91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么通過JVM角度談談Java的clone操作

發布時間:2021-02-08 10:47:38 來源:億速云 閱讀:122 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關怎么通過JVM角度談談Java的clone操作,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

前言

最近在給熔斷器組件增加一個降級策略(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接口,編譯的時候不檢查,想啥呢?

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

關于“怎么通過JVM角度談談Java的clone操作”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

烟台市| 寿光市| 浦北县| 方正县| 苍山县| 三明市| 潞城市| 玉门市| 九寨沟县| 胶南市| 新竹市| 云梦县| 安庆市| 叙永县| 西畴县| 玉屏| 姜堰市| 苍梧县| 岳普湖县| 开鲁县| 通州区| 怀远县| 金山区| 建宁县| 郁南县| 博爱县| 吉安市| 乌兰县| 丰台区| 嵊泗县| 皮山县| 华宁县| 洛川县| 锦屏县| 伊川县| 盖州市| 楚雄市| 睢宁县| 上杭县| 乌鲁木齐县| 洪雅县|