Потокобезопасный массив объектов - PullRequest
0 голосов
/ 21 февраля 2019

Я использую 2-мерный массив в Java.Но теперь я хочу использовать этот класс для многопоточности.Как я могу это сделать?

Я знаю, что, как я могу сделать потокобезопасную функцию (добавить синхронизированное ключевое слово).Что происходит, если функции clear и getItem запускаются одновременно?Как я могу сделать потокобезопасное inctance для этого случая?

public class ThreadSafeArray {
    int ROW_MAX_COUNT = 1024;

    int rowCount = 0;
    int counterForRow = 0;
    private Object [][] objInstances = new Object[ROW_MAX_COUNT][];

    public synchronized void addItem(Object obj) {
        if(counterForRow == ROW_MAX_COUNT) {
            objInstances[++rowCount] = new Object[ROW_MAX_COUNT];
            counterForRow = 0;
        }

        objInstances[rowCount][counterForRow++] = obj;
    }

    public synchronized  void clear() {
        objInstances = new Object[ROW_MAX_COUNT][];
        rowCount = 0;
        counterForRow = 0;
    }

    public synchronized Object getItem(int index) {
        int row = index / ROW_MAX_COUNT;
        int column = index % ROW_MAX_COUNT;

        if((row <= rowCount) && (column <= counterForRow)) {
            return objInstances[row][column];
        }
        return null;
    }
}

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Что произойдет, если функции clear и getItem будут запущены одновременно?

Один будет ждать до завершения другого.

Как мне это сделать?потокобезопасное inctance для этого случая?

Это уже потокобезопасно.

0 голосов
/ 21 февраля 2019

В вашем коде clear и getItem являются методами экземпляра.Установка синхронизированного метода экземпляра означает, что поток должен получить блокировку («внутреннюю блокировку») для экземпляра объекта, к которому вызывается метод, прежде чем поток сможет начать выполнение любого кода в этом методе.

Синхронизация методов экземпляра имеет два эффекта (из руководства по Java):

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

Итак, ваш класс уже поточно-ориентирован для этих двух методов.

...