Как предотвратить одновременное выполнение метода разными потоками в одном экземпляре класса - PullRequest
0 голосов
/ 03 декабря 2018

Скажем, у меня есть два потока, оба запущенные из данного экземпляра класса, А. Потоки должны выполнять метод из одного и того же экземпляра, но по одному за раз.Я попытался сделать метод синхронизированным, но, по-видимому, он применим, когда есть разные экземпляры, пытающиеся вызвать метод (из того, что я понял; простите, если я ошибаюсь).

Так как же мне это сделать,желательно стандартным или рекомендованным способом?

РЕДАКТИРОВАТЬ: Вот соответствующий код:

public class A {
.
.
.
  public void method1(){

    ExecutorService threadObject = Executors.newSingleThreadExecutor();
            threadObject.execute(new Runnable(){
                @Override
                public void run() {
                    try {
                        while (someCondition) {
                          //Here's one invocation
                          someObject = readObject();
                        }
                    }
                    catch (IOException | ClassNotFoundException ex) {}
                }
            });

    //Here's the other invocation
    while(someCondition){
      someObject = readObject();
    }
  }

  //Here's the synchronized method
  private synchronized SomeClass readObject() throws IOException, ClassNotFoundException{
          return (SomeClass) incomingResponses.readObject();
  }

  //Main method to instantiate the class
  public static void main(String ... args) {
    A = new A();
    A.method1();
  }
}

Я все еще не уверен, что я делаю неправильно.

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

synchronized методы являются ярлыком.ИМО, вы должны научиться делать это очень долго, прежде чем начать использовать ярлык:

Если у вас есть это:

class A {
    synchronized SomeType myMethod(...) {
        doSomeStuff(...);
        ...
        return someThing;
    }
}

Это ярлык для написания объявления метода с верхом-уровень синхронизированный оператор :

class A {
    SomeType myMethod(...) {
        synchronized (this) {
            doSomeStuff(...);
            ...
            return someThing;
        }
    }
}

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

0 голосов
/ 03 декабря 2018

Ваше утверждение неверно.Цитируя соответствующий пример из документации :

  • Во-первых, невозможно выполнить два вызова синхронизированных методов для одного и того же объекта для чередования.Когда один поток выполняет синхронизированный метод для объекта, все остальные потоки, которые вызывают синхронизированные методы для того же блока объекта (приостанавливают выполнение), пока первый поток не завершится с объектом.
  • Второй, когда синхронизированный методпри выходе из него автоматически устанавливается отношение «происходит до» с любым последующим вызовом синхронизированного метода для того же объекта.Это гарантирует, что изменения состояния объекта будут видны всем потокам.

Таким образом, ключевое слово synchrinzed, примененное к методу, не разрешит одновременные вызовы метода для конкретного экземпляра объекта.,

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