Подтвердить что ты не робот

Безопасен ли поток String.intern()

Я хотел бы использовать String.intern() в Java для сохранения памяти (используйте внутренний пул для строк с одним и тем же контентом). Я вызываю этот метод из разных потоков. Это проблема?

4b9b3361

Ответ 1

Короткий ответ на ваш вопрос - да. Это поточно-безопасный.

Однако вам может потребоваться пересмотреть использование этого средства, чтобы уменьшить потребление памяти. Причина в том, что вы не можете удалить какие-либо из списка интернированных строк. Лучшим решением было бы создать для вас собственное средство. Все, что вам нужно, это сохранить ваши строки в HashMap<String,String> так:

public String getInternedString(String s) {
    synchronized(strings) {
        String found = strings.get(s);
        if(found == null) {
            strings.put(s, s);
            found = s;
        }
        return found;
    }
}

Ответ 2

  • Когда возвращается неизменяемая строка Java-String, метод является потокобезопасным. Вы не можете манипулировать строкой as-is.

  • Документация действительно предполагает, что она является потокобезопасной. (путем подчеркивания для любого)

Отсюда следует, что для любых двух строк s и t s.intern() == t.intern() истинно тогда и только тогда, когда истинны s.equals(t).

  • В-третьих, JNI-интерфейс использует C-язык jobject s. jstring является одним из них и как и все jobject неизменяемы по определению. Таким образом, также на собственном уровне c мы сохраняем безопасность потоков.

Называя их, у нас есть веские причины сказать это поточно-безопасным.

PS: Однако вы можете столкнуться с трудными результатами, если используете несколько загрузчиков классов, потому что для String-пула поддерживается за String-class.

A pool of strings, initially empty, is maintained privately by the class String.