Если ваша подпрограмма не влияет на внешние переменные (без побочных эффектов), вы можете сказать, что является входящим .Хотя это не практическое правило, это хорошее руководство.
Если подпрограмма использует внешние переменные и сохраняет состояние внешних переменных в начале и восстанавливает это состояние в конце, тогда подпрограмма повторноабитуриент .
Если подпрограмма изменяет внешние переменные, и она не сохраняет их состояние в первую очередь и прерывается, состояние этих внешних переменных можно изменить, например, когда вызов возвращается в исходное положение в подпрограмме,внешняя переменная не синхронизирована, что приводит к несовместимому состоянию подпрограммы.
Повторно входящие функции сохраняют свое состояние (в своем локальном стеке, в стеке потока, не используя глобальные переменные).
В вашем случае вы обращаетесь к внешней переменной t
, но она реентерабельна, потому что переменная сохраняется и восстанавливается в конце подпрограммы.
Обычно Потоковая безопасность подразумевает повторное поступление, но опять же не правило, больше ориентир. Примечание: Некоторые блокировки в java являются реентерабельными, поэтому вы можете рекурсивно вызывать метод и не блокироваться предыдущими вызовами.(повторный вход в этом контексте означает, что потоки могут получить доступ к любому разделу, заблокированному с той же блокировкой - поток может повторно ввести любой блок кода, для которого он уже удерживает блокировку)
Решение / Ответ:
Если вы защищаете t
с помощью атомарного режима, вы должны получить подпрограмму с защитой потоков.Кроме того, если вы поместите t
в стек каждого потока (сделайте его локальным), тогда подпрограмма станет потокобезопасной, поскольку глобальных данных нет.
Кроме того, reentrant! = Recursive;вы также можете выполнить ISR в рекурсивной подпрограмме.Потоково, если вы вызовете рекурсивную подпрограмму из 2 потоков, вы получите мусор.Чтобы сделать потокобезопасным, защитите рекурсивную подпрограмму с помощью повторяющихся блокировок (другие не повторяющиеся блокировки приведут к взаимоблокировке / блокировке).