Увеличенная переменная экземпляра недоступна для следующего потока - PullRequest
0 голосов
/ 04 апреля 2019

Я очень новичок в темах.Поэтому, пожалуйста, прости мое невежество, если это очень простой вопрос.По сути, я пытаюсь написать список сотрудников в книгу Excel.Таким образом, в приведенном ниже классе метод startUp вызывается только один раз.Принимая во внимание, что метод записи вызывается несколько раз из 10 разных потоков.

@Component
class MyEmployeeWriter{
priavte int rowNum; // To start with, the rowNum is 0 here

public void startUp(Employees employee)
{
    // some logic ...
    this.rowNum++; //now rowNum is 1
}


public void write(Employees employees)
{
    Sheet sheet = workbook.getSheetAt(0);
    Row row = sheet.createRow(this.rowCount); //here for all the 10 threads the, rowNum is 1
    // Some more logic here...

    this.rowCount++;
}

}

Проблема, с которой я сталкиваюсь, заключается в том, что для всех 10 потоков this.rowCount равно 1. Увеличенное значение rowCount недоступно для следующей темы.

Пробная версия 1:

Я использовал ключевое слово volatile для rowNum.Это также не сработало.

Пробная версия 2:

Я попытался изменить rowNum на Integer(Wrapper class) и добавил к нему синхронизированный блок.Это тоже не сработало.

synchronized(this.rowNum) // I changed rowNum from int to Integer.
{
  // Some logic here
}

Любая помощь будет оценена.Спасибо.

1 Ответ

0 голосов
/ 04 апреля 2019

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

Обратите внимание, что ваш синхронизированный трюк ничего не делает; Целое число является неизменным: каждый раз, когда вы увеличиваете его, это другой экземпляр, и «synchronized (X)» не имеет никакого взаимодействия с любым другим синхронизированным (Y), если X и Y не являются ссылками на один и тот же объект.

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