Я узнал, что каждый байт-код класса загружается в память один раз для каждого загрузчика классов, таким образом, когда поток выполняет байт-код какого-либо метода, и появляется другой поток?
Загрузка класса и байт-код здесь не имеют значения.Байт-код - это набор инструкций, подобных сборке, которые JVM интерпретирует и компилирует в собственный машинный код.Более чем один поток может безопасно следовать наборам команд, закодированным в байтовом коде.
1 поток -> 1 экземпляр - класса Test, без проблем
В основном правильно.Если существует только один поток, то нет никакой необходимости делать что-либо потокобезопасным.Однако игнорирование безопасности потоков ограничит рост и возможность повторного использования.
X потоков -> 1 экземпляр - класса Test, необходимо обрабатывать это ясно.
Что ж, да, по причинам видимости потока и для обеспечения того, чтобы критические области выполнялись атомарно, использование методов синхронизации или блокировки довольно важно.Конечно, все зависит правильно ?!Если ваш класс не имеет состояния (экземпляра или переменных класса), то вам не нужно делать его поточно-ориентированным (подумайте о служебном классе, таком как Executors
, Arrays
, Collections
классы Java).
X потоков -> X соответствующих экземпляров - класса Test, ????
Если каждый поток имеет свой собственный экземпляр класса Test, и ни один экземпляр не является общим для всехболее одного потока, то это то же самое, что и ваш первый пример.Если на экземпляр Test ссылаются два или более потоков, то это то же самое, что и ваш второй пример.
, если метод использует переменные уровня класса, могу ли я быть уверен, что он будет использовать правильныйединицы?
Переменные класса ARE static
переменные в Java.Уже опубликовано два ответа, в которых подчеркивается важность использования synchronized
для предотвращения одновременного изменения переменной класса несколькими потоками.Не упоминается важность использования synchronized
или volatile
, чтобы убедиться, что вы не видите устаревшую версию переменной класса.