Что происходит в Java, если два класса вызывают метод в третьем классе одновременно? - PullRequest
2 голосов
/ 30 января 2011

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

Ответы [ 4 ]

8 голосов
/ 30 января 2011

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

3 голосов
/ 30 января 2011

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

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

public class Test {

    public static void main(String[] args) throws Exception {
        new Thread() { public void run() { Test.method(); }}.start();
        new Thread() { public void run() { Test.method(); }}.start();
    }

    public synchronized static void method() {
        System.out.println("hello ");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {}
        System.out.println("world");
    }
}

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

hello 
hello    
world
world

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

hello 
world
hello 
world
2 голосов
/ 30 января 2011

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

1 голос
/ 30 января 2011

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...