Java синхронизированные позитивы / негативы и использование - PullRequest
0 голосов
/ 24 мая 2018

Я прочитал всю теорию о том, как работают синхронизированные методы, но мне нужен практический пример.

Что такое положительное и отрицательное или использование синхронизированного типа:

public class Test {
    public static void main(String[] args){
        boolean sync = Boolean.valueOf(args[0]);
        Person person1 = person2 = new Person();

        person1.write(sync, args[1]);
        person1.read(sync);
        person2.write(sync, args[1]);
        person2.read(sync);

    }
}

запись именует проект: (синхронизировано или нет)

public static String project_name = "";

, а чтение печатает текущее имя человека (синхронизировано или нет)

Так в чем же разницакогда запись и чтение являются обычными методами по сравнению с синхронизированными?

Что может пойти не так, если я использую обычный метод?

1 Ответ

0 голосов
/ 24 мая 2018

Быстрый ответ: Несинхронный метод, к которому обращаются из нескольких источников, обычно вызывает неопределенное поведение, но синхронизированный метод будет работать каждый раз.

Более длинный ответ: Я не думаю, что вы полностью понимаете, что такое синхронизированный метод, потому что ваш код не демонстрирует его вообще.

Если на самом деле есть возможность доступа 100 человек к одному и тому же методу, то у вас будет неопределенныйповедение при записи и считывании одной и той же переменной.

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

Дляпример: 100 различных потоков (люди?) могут вызывать SynchronizedProjectName.renameProject("exampleName"); и / или SynchronizedProjectName.projectName(); в приведенном ниже коде, и при этом не возникнет никакой ошибки, и в это же время не произойдет чтение / запись.

public class SynchronizedProjectName {
    private string project_name = "";

    public synchronized void renameProject(String newProjectName) {
        project_name = newProjectName;
    }

    public synchronized string projectName() {
        return project_name;
    } 
}

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

См. здесь немного дополнительной информации: https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html

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