Java - многопоточный кэш процессора

1

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

Но, например, если у меня есть этот объект

public class MyObject {
    int a = 2;
}

и теперь поток делает что-то вроде этого:

MyObject obj = new MyObject();
obj.a=3;

Мой вопрос:
что будет сохранено в кэше процессора? всю структуру MyObject или просто ссылку? Я думаю, что вся структура (есть больше смысла), но я предпочитаю спросить, потому что я хотел бы быть уверен в этом.

Я новичок в многопоточности, и я уверен, что сложнее, как работает кеш-процессор, но на данный момент мне нужна только основная информация.

Теги:
multithreading
caching

2 ответа

0

Этот вопрос имеет две стороны:

Что делает процессор: процессор предназначен для того, чтобы все в кеше было необходимо очень часто. Если вы измените значение, оно будет сохранять изменения в кеше до тех пор, пока не понадобится записать его в основную память (на самом деле это зависит от стратегии резервного копирования процессоров против записи). "Потребность" в записи в основную память программно контролируется или ЦП отказывается от своего места для других вещей. Чтобы ответить на одну часть вашего вопроса: для ЦП все - данные, значение, заданное вами в Java, и структуры данных внутренних объектов. Чтобы получить доступ к вашему значению, вам нужно сначала указать адрес объекта, так что это тоже возможно в кеше :)

Второй момент - это то, что Java-программист должен ожидать и не ожидать: это точно определено в модели памяти Java. Просто запустите здесь: http://en.wikipedia.org/wiki/Java_Memory_Model

Итак, для ваших строк:

MyObject obj = new MyObject();
obj.a=3;

Нет гарантии, что другой поток, запущенный после этого кода, увидит новое значение. И он также может не видеть вашу новую ссылку на объект, но вместо нее. Вам нужен синхронизированный блок или изменчивая переменная.

  • 0
    о "грязном" чтении я знаю ... это нормально, потому что без синхронизации процессор может иметь другое значение для разделяемой и изменяемой переменной. Но ... Если я понимаю, что вы написали ... в кеше сохраняется: ссылка на объект, а также его структура правильно? это потому, что если бы это была просто ссылка ... нам нужно было бы пойти в кучу основной памяти, чтобы поймать, что находится на ссылке, сохраненной в кэше ... верно? так в кеше сохраняется ссылка и структура объекта верна?
  • 0
    Джованни, вы на неправильном пути. «сохранить» и «кэшировать» - это два разных понятия. Ничего не сохраняется в кеше. Кэш просто хранит данные, которые, вероятно, понадобятся или изменятся снова, очень скоро в будущем. Это не только данные, но и код инструкции процессора. Смотрите: en.wikipedia.org/wiki/CPU_cache
Показать ещё 1 комментарий
0

В вашем примере действует только один поток. Для этого потока кеш прозрачен - нет способа определить, находится ли значение в кеше, в основной памяти или и то, и другое. Сначала все значения помещаются в кеш, но потом очень скоро, в неизвестный момент времени их выталкивают.

"Я бы хотел быть уверен в этом" - почему? Поведение этой программы не зависит от этого.

  • 0
    Я думаю, что вы не полностью поняли мой вопрос ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню