Ich möchte String.intern() in Java verwenden, um Speicher zu sparen (den internen Pool für Zeichenfolgen mit dem gleichen Inhalt verwenden). Ich rufe diese Methode aus verschiedenen Threads. Ist es ein Problem?Ist String.intern() Thread sicher
Antwort
Die kurze Antwort auf Ihre Frage ist ja. Es ist threadsicher.
Sie sollten diese Möglichkeit jedoch noch einmal überdenken, um den Speicherverbrauch zu reduzieren. Der Grund dafür ist, dass Sie keine Einträge aus der Liste der intern gespeicherten Zeichenfolgen entfernen können. Eine bessere Lösung wäre, eine eigene Einrichtung dafür zu schaffen. Alles, was Sie brauchen würden, ist die Saiten in einem HashMap<String,String>
wie so zu speichern:
public String getInternedString(String s) {
synchronized(strings) {
String found = strings.get(s);
if(found == null) {
strings.put(s, s);
found = s;
}
return found;
}
}
(plus Sperren, da das OP Thread-Sicherheit will) – CodesInChaos
Sie könnten auch die schreckliche 'interne' Leistung erwähnen. Wenn ich mich richtig erinnere, ist die Komplexität der Zeit O (* n *), wobei * n * die aktuelle Größe des String-Pools ist. –
Sollte das nicht "if (found == null)" sein? Wie geschrieben, ist dies kaum Thread-sicher, auch wenn "Strings" eine Thread-sichere Datenstruktur sind. –
als unveränderlicher Java-String zurückgegeben wird, ist die Methode Thread-sicher. Sie können die Zeichenfolge nicht wie bisher bearbeiten.
Die Dokumentation schlägt wirklich vor, dass es thread-safe ist. (Von für jeden Betonung)
Daraus folgt, dass für jeden zwei Strings s und t, s.intern() == t.intern() ist wahr, wenn und nur wenn s .equals (t) ist wahr.
- Drittens ist die JNI-Schnittstelle verwendet, C-Sprache
jobject
s.jstring
ist einer von ihnen und ist wie allejobject
per Definition unveränderlich. Somit bewahren wir auch auf einer nativen C-Ebene die Fadensicherheit.
Wenn wir diese Namen nennen, haben wir gute Gründe dafür zu sagen, dass sie threadsicher sind.
PS: Sie könnten jedoch in schwierigen Ergebnissen enden, wenn Sie mehrere Klassenladeprogramme verwenden, da der String-Pool gemäß String-class
verwaltet wird.
'java.lang.String' kann nur vom Bootstrap-Klassenlader geladen werden. – irreputable
@irreputable Ich bin mir nicht sicher, wie Sie es tun würden, aber wenn es einer tut, könnte es von Bedeutung sein. – poitroae
- 1. Ist createTempFile Thread-sicher?
- 2. ist DatagramSocket.send thread sicher?
- 3. Ist DWScript Thread-sicher?
- 4. Ist File.ReadAllText Thread sicher?
- 5. Ist HtmlCleaner Thread sicher?
- 6. Ist DocumentBuilder.parse() Thread sicher?
- 7. Ist SDL_Delay() Thread sicher?
- 8. ist javax.sql.DataSource thread sicher?
- 9. Ist SoapHttpClientProtocol Thread sicher?
- 10. Ist beanManager.getReference() Thread-sicher?
- 11. Ist TStringList Thread sicher?
- 12. Ist Closesocket Thread sicher?
- 13. Ist libuv thread sicher?
- 14. Ist ConstructorInfo.GetParameters Thread-sicher?
- 15. Ist SessionFactory.getCurrentSession() Thread sicher?
- 16. Ist SKNode Thread sicher?
- 17. Ist RequestContextHolder Thread-sicher?
- 18. Ist putStrLn Thread-sicher?
- 19. Ist Joiner Thread sicher?
- 20. Ist Stream.Write Thread-sicher?
- 21. Ist SQLite.Net Thread-sicher?
- 22. Ist Collectors.joining (",") Thread-sicher?
- 23. Ist Netty Channel.write Thread sicher?
- 24. Ist std :: regex thread sicher?
- 25. Ist Perls inet_aton Thread-sicher?
- 26. Ist diese Klasse Thread sicher?
- 27. Ist Java TimeZone Thread-sicher?
- 28. Ist java.util.Vector Serialisierung Thread-sicher?
- 29. Ist Netty Channel.close() Thread sicher?
- 30. Ist Gürteltier lösen() Thread sicher?
Wäre sehr überrascht, wenn es nicht threadsicher ist. Das wäre ein großer Fehler in diesem Bibliotheksdesign. – CodesInChaos
Woher kommen diese Saiten? – jlordo
@jlordo - Ein beliebiger String-Ausdruck, bei dem es sich nicht um eine Kompilierzeitkonstante handelt, wird nicht automatisch interniert. So zum Beispiel 'new String (" abc ")! =" Abc "'; jedoch, "ab" + "c" == "abc" '(wegen des Internierens). –