Нужно ли синхронизировать созданный Java-объект для доступа? - PullRequest
2 голосов
/ 13 ноября 2011

Я смотрю на поставляемый Java-код для Deflater . Я заметил, что все методы доступа к объекту ZStreamRef, созданному изначально, синхронизируют доступ к нему. Например:

public void setLevel(int level) {
if ((level < 0 || level > 9) && level != DEFAULT_COMPRESSION) {
    throw new IllegalArgumentException("invalid compression level");
}
    synchronized (zsRef) {
        if (this.level != level) {
            this.level = level;
            setParams = true;
        }
    }
}

Тем не менее, Javadoc не упоминает, что Deflater является потокобезопасным. Требуется ли синхронизировать объекты, созданные изначально, до доступа к ним?

Ответы [ 2 ]

2 голосов
/ 13 ноября 2011

В документации не указано, что она должна быть поточно-ориентированной, и она не может быть поточно-ориентированной на всех платформах.Однако в OpenJDK это так.Не уверен, что он очень полезен, так как его состояние и состояние почти наверняка потребует внешней блокировки для разделения потока между потоками.(В чем я сомневаюсь, это хорошая идея)

0 голосов
/ 06 февраля 2013

Я считаю, что это не потокобезопасно и должно содержать некоторое внутреннее состояние.Я пробовал некоторые тесты и постоянно вижу сбои, сжимающие большие (> 20 Мб) наборы данных во множестве потоков (в некоторых из них дефляция возвращает 0).(Работает JavaSE-1.6)

...