簡體   English   中英

Java線程中的實例變量(對象,不是基本類型)緩存

[英]Instance variable (Object ,not primitive) caching in Java Thread

Java線程是否緩存Instance變量,或者將在所有線程之間共享它?

Class CachedObject{
    MyClass object1 = new MyClass();

    public void changeValue(int i){
        object1.setValue(i);
    }
}

讓我們假設, changeValue方法將被多個線程訪問,然后object1將被緩存在每個線程緩存中或將被共享?

我了解synchronized ,如果我在方法上使用了synchronized ,一切都會好的,但是我在這里特別詢問線程緩存。 我知道局部變量被緩存在線程緩存中,但是我對實例變量感到困惑。 謝謝..

線程本身不會緩存任何內容。
但是線程根據CPU線程模型在不同的內存數據中進行讀寫操作。
因此,可能需要與線程之間的主內存進行同步。
在您的情況下,如果您創建一個在多個線程之間共享的CachedObject的單個實例, CachedObject這種方式實現setValue() ,其他線程的新object1狀態可能不會更新/可見:

public void setValue(int i){
   this.value = i;
}

因為它為int字段分配了一個新值,而沒有任何僅對當前線程可見的同步。

但是通過這些方式,您將不會遇到問題:

private int volatile value;
public void setValue(int i){      
   this.value = i;
}

要么 :

public void setValue(int i){
   synchronized(this){
      this.value = i;
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM