Что произойдет в Java, если два класса одновременно вызовут метод третьего класса?

StackOverflow https://stackoverflow.com/questions/4843220

Вопрос

В моем проекте есть игровой класс, который вызывается клиентским классом.В настоящий момент игровой класс записывает путь к файлу, а клиентский класс будет читать из этого файла и очищать содержимое.У меня слишком много конфликтов с доступом, поэтому я хочу использовать другой класс в качестве метода для хранения данных пути.Однако я хочу знать, останется ли проблема или каков будет результат, если игровой класс попытается вызвать метод в классе хранилища для записи, в то время как клиентский класс в тот же момент вызывает метод в хранилищекласс, чтобы прочитать и очистить.

Это было полезно?

Решение

Похоже, вам нужно подумать о потоковой передаче и синхронизации.Я бы рекомендовал прочитать «Java Concurrency in Practice».

Другие советы

При наличии нескольких потоков ваши классы должны быть потокобезопасными .Один из способов добиться этого - заставить методы с одновременным доступом генерировать код кода.

Вот пример для начала:

родовое слово

Без модификатора synchronized эта программа напечатала бы

родовое слово

С ключевым словом synchronized только один поток может одновременно вызывать synchronized, поэтому программа печатает

родовое слово

Я предполагаю, что ваши два класса работают в разных потоках, поэтому они могут обращаться к третьему классу одновременно.Доступ к ресурсу, который они читают и записывают, должен быть синхронизирован (мьютексирован).В Java есть ключевое слово «синхронизировано», которое можно использовать разными способами для предотвращения одновременных изменений и т. Д., См. здесь и здесь подробнее

Теоретически правильный ответ: «всякое бывает».

Два вызова могут выполняться один за другим или чередоваться друг с другом, результаты непредсказуемы и потенциально катастрофичны.

Вот почему Java предлагает несколько способов справиться с этим.

  1. Самый простой (звучный) способ - написать свои методы потокобезопасными. На практике это обычно означает, что вы должны использовать только локальные переменные и не должны изменять объекты, которые передаются вам в качестве параметров. (Без побочных эффектов.) Многие методы автоматически попадают в эту категорию, и в этом случае вам не нужно беспокоиться о параллелизме.

  2. Если ваш метод нельзя сделать потокобезопасным, вам нужно каким-то образом обработать параллельные вызовы. Блоки synchronized являются наиболее часто используемыми конструкциями, но в некоторых случаях достаточно поля volatile или использования классов Atomic*. Но эта тема слишком сложна, чтобы ее можно было охватить одним ответом, поэтому я предлагаю вам прочитать руководство по параллелизму .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top