Кэширование переменной экземпляра (Object, not primitive) в потоке Java - PullRequest
0 голосов
/ 10 декабря 2018

Кеширует ли поток Java переменную Instance или она будет использоваться всеми потоками?

Class CachedObject{
    MyClass object1 = new MyClass();

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

Предположим, что метод changeValue будет доступен для нескольких потоков, тогда object1 будеткэшируется в каждом потоке кеша или будет ли он общим?

Я знаю о synchronized, и если я использую synchronized в методе, все будет хорошо, но я специально спрашиваю о кешировании потока здесь.Я знаю, что локальные переменные кэшируются в потоке кеша, но я не совсем понимаю переменную Instance.Спасибо ..

1 Ответ

0 голосов
/ 10 декабря 2018

Потоки сами ничего не кешируют.
Но потоки читают / записывают в отдельные данные памяти, которые они читают / записывают в соответствии с моделью потоков CPU.
И по этой причине синхронизация с основной памятью между потокамиможет потребоваться.
В вашем случае, если вы создаете один экземпляр CachedObject, который совместно используется несколькими потоками, новое состояние object1 может быть не обновлено / невидимо для других потоков, если setValue() реализован в этомway:

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;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...