MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Sollte ich den Java String Pool für die Synchronisierung basierend auf einer eindeutigen Kunden-ID verwenden?

Nun, wenn Ihre Zeichenfolgen eindeutig genug sind (z. B. über einen kryptografischen Hash generiert), wird die Synchronisierung auf Client-IDs wahrscheinlich funktionieren , solange Sie String.intern() aufrufen auf sie zuerst. Da die IDs eindeutig sind, werden Sie wahrscheinlich nicht auf Konflikte mit anderen Modulen stoßen, es sei denn, Sie übergeben Ihre IDs zufällig an sie und sie folgen der schlechten Praxis, sich auf sie zu sperren.

Das heißt, es ist wahrscheinlich eine schlechte Idee. Zusätzlich zu der kleinen Chance, eines Tages in unnötige Konflikte zu geraten, wenn jemand anderes auf denselben String einrastet Beispielsweise besteht das Hauptproblem darin, dass Sie intern() müssen Ihr gesamter String -Objekte, und dies leidet oft unter schlechter Leistung aufgrund der nativen Implementierung der internen String-Tabelle, ihrer festen Größe usw. Wenn Sie wirklich nur auf der Grundlage eines String sperren müssen verwenden Sie besser Interners.newWeakInterner() interne Implementierung, die wahrscheinlich viel besser abschneiden wird. Wickeln Sie Ihren String in eine andere Klasse ein, um Konflikte mit dem eingebauten String zu vermeiden sperren. Weitere Einzelheiten zu diesem Ansatz in dieser Antwort .

Abgesehen davon gibt es oft ein anderes natürliches Objekt, auf das man sich sperren kann, wie zum Beispiel eine Sperre in einem Sitzungsobjekt usw.

Dies ist ziemlich ähnlich zu dieser Frage die ausführlichere Antworten enthält.

... oder mindestens genug Bits haben, um Kollisionen unwahrscheinlich genug zu machen, und wenn Ihre Client-IDs nicht Teil Ihres Angriffsfläche .