нестатические переменные существуют в разных местах в памяти для каждого потока
Это не так, поэтому ответ на
если кодвыполнение потоков включает некоторую переменную класса v1, тогда у каждого потока есть свой собственный «экземпляр» v1 (другой адрес памяти), и никакой другой поток не может «дотронуться» до него ... не так ли
нет.Потоки могут касаться экземпляров объекта, выделенных и измененных другими потоками, и это требует от программиста нагрузки, чтобы гарантировать, что это не влияет на корректность программы.
Переменные-члены класса существуют в одном месте в памяти на экземпляр класса, а не нанить.Это верно, что между барьерами памяти (представьте начало {
и конец }
из synchronized
), что поток может иметь кэш состояния объекта, но это нетакой же, как язык, предписывающий хранение для каждого потока.«Память для каждого потока» - это его стек, который не содержит членов объекта * - только ссылки на объекты.
Лучший способ думать об этом состоит в том, что для каждого объекта в куче существует одно место,но в то же время может происходить несколько операций чтения и записи, связанных с этим местом в памяти.
Я вижу, как вы пришли бы к выводам, которые вы сделали, если бы услышали, что потоки размещают объекты в разных частях кучи.,Некоторые JVM имеют оптимизацию, посредством которой они делают локальное распределение потоков , но это не мешает другим потокам обращаться к этим объектам.
локальное распределение потоков
Если бы распределитель был действительно реализован, как показано в листинге 1, общее поле heapStart быстро стало бы существенным узким местом параллелизма, поскольку каждое распределение включало бы получение блокировки, которая защищает это поле.Чтобы избежать этой проблемы, большинство JVM используют локальные блоки распределения потоков, где каждый поток выделяет больший кусок памяти из кучи и обслуживает небольшие запросы выделения последовательно из этого локального блока потока.В результате число раз, когда поток должен получить блокировку общей кучи, значительно уменьшается, улучшая параллелизм.
* - возможно, оптимизации JVM позволят некоторым объектам выделяться в стеке .