синхронизация - PullRequest
       8

синхронизация

2 голосов
/ 25 февраля 2011

Скажем, у меня есть класс с синхронизированными методами.На самом деле это класс, который использует Apache POI для записи файлов Excel.

public static synchronized List<CellData> createRow(final CellData... columns) {
        List<CellData> row = new ArrayList<CellData>();

        if (columns != null && columns.length > 0) {
            for (CellData column : columns) {
                row.add(column);
            }
        }
        return row; 
    }

public synchronized void writeFile() throws IOException {
       .................
}

Этот вспомогательный класс находится в jar (общей библиотеке), и многие программы используют его одновременно.

DoМне действительно нужно синхронизировать этот класс, так как каждый другой класс, который его использует, создает экземпляр этого вспомогательного класса?

Ответы [ 6 ]

4 голосов
/ 25 февраля 2011

ключевое слово synchronized выполняет синхронизацию только между потоками, которые вызывают метод для одного и того же экземпляра объекта.

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

1 голос
/ 25 февраля 2011

Если метод не использует какие-либо поля-члены класса (т. Е. Использует только локальные переменные), синхронизация не требуется

1 голос
/ 25 февраля 2011

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

Итак, вопросы:

  1. Ваши методы фактически разделяют доступ к каким-либо переменным экземпляра?

  2. У вас когда-нибудь будет несколько потоков, одновременно получающих доступ к одному экземпляру вашего класса?

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

1 голос
/ 25 февраля 2011

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

0 голосов
/ 05 сентября 2013

Мало что здесь нужно отметить

  • классы не синхронизированы.
  • Методы или блоки методов синхронизированы.Когда мы говорим синхронизированный, это означает, что только один поток будет выполнять код в методе или в синхронизированном блоке.
  • Синхронизация необходима только в том случае, если общий ресурс считывается и изменяется несколькими потоками.
  • Если в методе все ваши переменные являются только локальными, синхронизация вам не требуется.Если у вас есть переменная, которая не является локальной, или параметр, который имеет какую-то другую ссылку, и они могут быть прочитаны / изменены несколькими потоками, вам следует подумать о синхронизации этого метода.
0 голосов
/ 25 февраля 2011

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

Ваш метод (на должности) манипулирует данными, которые были переданы в качестве параметра, поэтому вам не нужно использовать синхронизацию.

Но если ваш статический метод будет манипулировать (изменять) общедоступными статическими данными, он потребует использования синхронизации метода.

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