Gibt es einen gemeinsamen Java-Bibliothek, die handle-URL-Codierung/Decodierung für eine Sammlung von strings?
Habe ich oft zu url-codieren oder decodieren, die eine große Sammlung oder ein array von strings. Außerdem Durchlaufen werden und mit der statischen URLDecoder.decode(string, "UTF-8"), gibt es Bibliotheken gibt, die diese Art der operation mehr performant?
Einer Kollegin besteht darauf, dass Sie mit der statischen Methode zum decodieren der strings in-place) ist nicht thread-sicher. Warum würde das sein?
- Es sei denn, die statische Methode greift auf statische Variablen in der Klasse URLDecoder, jeder Aufruf der Methode geht auf den Stapel separat und ist thread-sicher. Ich sehe keinen Grund, warum URLDecoder.decode(...) müsste jedem Zugriff auf freigegebene Ressourcen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
JDK URLDecoder nicht effizient umgesetzt. Vor allem, intern setzt auf StringBuffer (die unnötig stellt die Synchronisation im Fall von URLDecoder). Die Apache commons bietet URLCodec, aber es wurde auch berichtet, dass ähnliche Probleme in Bezug auf Leistung, aber ich habe nicht überprüft, die ist immer noch der Fall in der aktuellsten version.
Mark A. Ziesemer schrieb einen Beitrag eine Weile zurück, über die Probleme und die Leistung mit URLDecoder. Er protokolliert einige bug-reports und endete schreiben einen vollständigen Ersatz. Weil dies SO ist, ich zitiere hier einige der wichtigsten Auszüge hier, aber Sie sollten wirklich Lesen Sie die gesamte Quelle Artikel hier: http://blogger.ziesemer.com/2009/05/improving-url-coder-performance-java.html
Ausgewählte Zitate:
...
...
Ich denke, deine Kollegin ist falsch zu vermuten URLDecode ist nicht thread-safe. Andere Antworten hier im detail zu erklären.
BEARBEITEN [2012-07-03] - Pro später Kommentar gepostet von OP
Nicht sicher, ob du auf der Suche nach mehr Ideen oder nicht? Sie sind richtig, dass, wenn Sie beabsichtigen, zu betreiben, auf der Liste, wie ein atomic-Kollektion, dann müssten Sie synchronisieren Sie alle Zugriff auf die Liste, einschließlich der Verweise, die außerhalb der Methode. Allerdings, wenn Sie in Ordnung sind mit der zurückgegebenen Liste Inhalt möglicherweise abweichend von der ursprünglichen Liste, dann ist eine brute-force-Ansatz für den Betrieb auf einem "Stapel" von strings aus einer Sammlung, die möglicherweise durch andere threads verändert werden könnten in etwa so Aussehen:
Wenn das nicht hilft, dann bin ich mir noch nicht sicher, was Sie nach, und Sie wäre besser gedient werden, erstellen Sie eine neue, konkretere, Frage. Wenn es das ist, was Sie gefragt wurden, dann vorsichtig sein, da dieses Beispiel aus dem Kontext ist nicht eine gute Idee für viele Gründe.
Thread-Sicherheit ist eigentlich nie wirklich notwendig, die mit statischen Aufgaben (oder ist es ein design-Fehler). Vor allem nicht, wenn Sie nicht selbst Zugriff auf statische Variablen in der Klasse.
Ich würde vorschlagen, mit der Funktion, die Sie zuvor verwendet, und die Iteration durch die Sammlung
Grundsätzlich gibt es keine Magie, thread-Sicherheit angewendet, um die statischen Methoden oder Instanz-Methoden oder Konstruktoren. Sie alle können genannt werden, auf die mehrere threads gleichzeitig, es sei denn, die Synchronisation angewendet wird. Wenn Sie sich nicht abrufen oder ändern einer freigegebenen Daten, Sie werden in der Regel sicher - wenn Sie auf gemeinsame Daten zugreifen, müssen Sie vorsichtiger sein.
so, In Ihrem Fall kann man schreiben synchronisierte Methode auf der Oberseite von diesem urldecoding oder Codierung können Sie durch die Durchsetzung der thread-Sicherheit nach außen.
Apache hat URLCodec, die verwendet werden können für die Codierung-Decodierung.
Wenn Ihr statische Methode nur funktioniert, auf die lokalen Variablen oder final Variablen initialisiert, dann ist es vollständig thread-sicher.
Als Parameter live auf Stapel, und Sie sind vollständig thread-sicheren, endgültigen Konstanten unveränderlich sind daher nicht geändert werden.
Folgende code ist vollständig thread-sicher:
Sorge sollte genommen werden, wenn die endgültige Variablen sind veränderliche dh Sie können nicht zuweisen, aber Sie können ändern, seine interne Repräsentation(Eigenschaften).