Я знаю, что потоки сохраняют значения переменных в кэше процессора, где он запущен, потому что таким образом процессор не ждет столько времени, когда необходимо получить значения внутри переменных.
Но, например, если у меня есть этот объект
public class MyObject {
int a = 2;
}
и теперь поток делает что-то вроде этого:
MyObject obj = new MyObject();
obj.a=3;
Мой вопрос:
что будет сохранено в кэше процессора? всю структуру MyObject
или просто ссылку? Я думаю, что вся структура (есть больше смысла), но я предпочитаю спросить, потому что я хотел бы быть уверен в этом.
Я новичок в многопоточности, и я уверен, что сложнее, как работает кеш-процессор, но на данный момент мне нужна только основная информация.
Этот вопрос имеет две стороны:
Что делает процессор: процессор предназначен для того, чтобы все в кеше было необходимо очень часто. Если вы измените значение, оно будет сохранять изменения в кеше до тех пор, пока не понадобится записать его в основную память (на самом деле это зависит от стратегии резервного копирования процессоров против записи). "Потребность" в записи в основную память программно контролируется или ЦП отказывается от своего места для других вещей. Чтобы ответить на одну часть вашего вопроса: для ЦП все - данные, значение, заданное вами в Java, и структуры данных внутренних объектов. Чтобы получить доступ к вашему значению, вам нужно сначала указать адрес объекта, так что это тоже возможно в кеше :)
Второй момент - это то, что Java-программист должен ожидать и не ожидать: это точно определено в модели памяти Java. Просто запустите здесь: http://en.wikipedia.org/wiki/Java_Memory_Model
Итак, для ваших строк:
MyObject obj = new MyObject();
obj.a=3;
Нет гарантии, что другой поток, запущенный после этого кода, увидит новое значение. И он также может не видеть вашу новую ссылку на объект, но вместо нее. Вам нужен синхронизированный блок или изменчивая переменная.
В вашем примере действует только один поток. Для этого потока кеш прозрачен - нет способа определить, находится ли значение в кеше, в основной памяти или и то, и другое. Сначала все значения помещаются в кеш, но потом очень скоро, в неизвестный момент времени их выталкивают.
"Я бы хотел быть уверен в этом" - почему? Поведение этой программы не зависит от этого.