Что произойдет в Java, если два класса одновременно вызовут метод третьего класса?
-
27-10-2019 - |
Вопрос
В моем проекте есть игровой класс, который вызывается клиентским классом.В настоящий момент игровой класс записывает путь к файлу, а клиентский класс будет читать из этого файла и очищать содержимое.У меня слишком много конфликтов с доступом, поэтому я хочу использовать другой класс в качестве метода для хранения данных пути.Однако я хочу знать, останется ли проблема или каков будет результат, если игровой класс попытается вызвать метод в классе хранилища для записи, в то время как клиентский класс в тот же момент вызывает метод в хранилищекласс, чтобы прочитать и очистить.
Решение
Похоже, вам нужно подумать о потоковой передаче и синхронизации.Я бы рекомендовал прочитать «Java Concurrency in Practice».
Другие советы
При наличии нескольких потоков ваши классы должны быть потокобезопасными .Один из способов добиться этого - заставить методы с одновременным доступом генерировать код кода.
Вот пример для начала:
родовое слово Без модификатора synchronized
эта программа напечатала бы
С ключевым словом synchronized
только один поток может одновременно вызывать synchronized
, поэтому программа печатает
Я предполагаю, что ваши два класса работают в разных потоках, поэтому они могут обращаться к третьему классу одновременно.Доступ к ресурсу, который они читают и записывают, должен быть синхронизирован (мьютексирован).В Java есть ключевое слово «синхронизировано», которое можно использовать разными способами для предотвращения одновременных изменений и т. Д., См. здесь и здесь подробнее
Теоретически правильный ответ: «всякое бывает».
Два вызова могут выполняться один за другим или чередоваться друг с другом, результаты непредсказуемы и потенциально катастрофичны.
Вот почему Java предлагает несколько способов справиться с этим.
-
Самый простой (звучный) способ - написать свои методы потокобезопасными. На практике это обычно означает, что вы должны использовать только локальные переменные и не должны изменять объекты, которые передаются вам в качестве параметров. (Без побочных эффектов.) Многие методы автоматически попадают в эту категорию, и в этом случае вам не нужно беспокоиться о параллелизме.
-
Если ваш метод нельзя сделать потокобезопасным, вам нужно каким-то образом обработать параллельные вызовы. Блоки
synchronized
являются наиболее часто используемыми конструкциями, но в некоторых случаях достаточно поляvolatile
или использования классовAtomic*
. Но эта тема слишком сложна, чтобы ее можно было охватить одним ответом, поэтому я предлагаю вам прочитать руководство по параллелизму .