Я хотел бы использовать String.intern() в Java для сохранения памяти (используйте внутренний пул для строк с одним и тем же контентом). Я вызываю этот метод из разных потоков. Это проблема?
Безопасен ли поток String.intern()
Ответ 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.