Якщо метод має доступ лише до локальних змінних, це безпечно для потоків. Це все?
Абсолютно ні. Ви можете написати програму лише з однією локальною змінною, доступ до якої є з одного потоку, який, тим не менш, не є безпечним для потоків:
https://stackoverflow.com/a/8883117/88656
Чи застосовується це і для статичних методів?
Абсолютно не.
Одна відповідь, надана @Cybis, була: "Локальні змінні не можна ділити між потоками, оскільки кожен потік отримує власний стек."
Абсолютно не. Відмітна характеристика локальної змінної полягає в тому, що вона видно лише з локальної області , а не тим, що вона виділяється у тимчасовий пул . Цілком легально і можливо отримати доступ до тієї ж локальної змінної з двох різних потоків. Це можна зробити за допомогою анонімних методів, лямбда, блоків ітераторів або методів асинхронізації.
Це стосується і статичних методів?
Абсолютно не.
Якщо метод передається посилальним об'єктом, чи порушує це безпека потоку?
Може бути.
Я провів деякі дослідження, і там є багато, що стосується певних випадків, але я сподівався, що зможу визначити, використовуючи лише кілька правил, рекомендацій, які слід дотримуватися, щоб переконатися, що метод є безпечним для потоків.
Вам доведеться навчитися жити з розчаруванням. Це дуже складний предмет.
Отже, я думаю, моє остаточне запитання таке: "Чи є короткий список правил, які визначають безпечний для потоків метод?
Ні. Як ви бачили з мого прикладу раніше , порожній метод може бути безпечним для потоків . Ви також можете запитати "чи є короткий список правил, які забезпечують правильність методу ". Ні, немає. Безпека нитки - це не що інше, як надзвичайно складний вид правильності.
Більше того, той факт, що ви задаєте питання, вказує на ваше принципове непорозуміння щодо безпеки потоку. Безпека ниток - це глобальна , а не локальна властивість програми. Причина, чому так важко поправитись, полягає в тому, що для того, щоб забезпечити її безпеку, ви повинні мати повне знання про поведінку нитки всієї програми .
Ще раз погляньте на мій приклад: кожен метод тривіальний . Саме спосіб взаємодії один з одним на "глобальному" рівні робить програму тупиковою. Ви не можете розглядати кожен метод і перевіряти його як "безпечний", а потім очікувати, що вся програма є безпечною, і не більше, ніж ви можете зробити висновок, що оскільки ваш будинок виготовлений з 100% не порожнистих цегли, що і будинок не порожнистий. Порожнеча будинку - це глобальна властивість всієї речі, а не сукупність властивостей її частин.