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

Я сейчас что-то программирую, где у меня есть несколько экземпляров объекта, работающего в разных потоках.Я хочу иметь синхронизированный метод, который может одновременно выполнять только один экземпляр объекта.Я знаю, что ключевое слово synchronized не будет работать, поскольку оно работает только для одного экземпляра объекта, и создание целого метода static на самом деле не вариант.В настоящее время я использую static boolean, который Threads проверяет, занят ли метод вместе с вызовом метода Thread.sleep().Это выглядит следующим образом:

    while(occupied){
        Thread.sleep(randomGenerator.nextInt(1000) + 500);
    }

    occupied = true;
    int bufferLength = outputBuffer.size();

    System.out.println(name + "Size=" + outputBuffer.size());
    System.out.print(name + ": ");

    for(int i=0; i<bufferLength; i++){
        System.out.print(outputBuffer.take().get("Order Number") + ",");
    }

    System.out.println("\n" + name + " is finished.\n");

    occupied = false;

boolean occupied - это статическая переменная, которая используется совместно для 4 экземпляров моего объекта.

Это дает мне желаемые результаты, но я чувствуюнапример, перевести потоки в спящий режим на случайное количество времени - это грязный способ получить желаемый результат, и при этом у него очень небольшой шанс ошибиться.Есть ли более чистый способ сделать это?

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

edit: немного исправил код

1 Ответ

0 голосов
/ 19 октября 2018

Вам просто нужно синхронизироваться на объекте общей блокировки:

private static final Object LOCK = new Object();

public void foo() {
    synchronized(LOCK) {  
        ...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...