2012-03-24 8 views
2

Ich habe mehrere Threads (ca. 40) für den Zugriff auf persistente Variablen (Strings und Longs) für mehrere hundert Benutzer in einer Java-Anwendung. Was ist der beste Weg, um diese Variablen zu speichern? Das Lesen und Schreiben der Variablen kann jederzeit erfolgen, und ich möchte nicht nur die CPU-Last minimieren, sondern auch die Auswirkungen reduzieren, wenn eine Variable nicht verfügbar ist, weil sie geschrieben wird.Best Practices für mehrere Threads und Persistenzen

Ich denke daran, eine Datei für jeden Benutzer zu erstellen, alle Variablen für diesen Benutzer in eine Zeichenfolge zu konvertieren und diese Datei zu schreiben oder zu lesen, wenn ich eine Variable brauche.

... oder erstellen Sie eine HashMap für jeden Benutzer (Schlüssel) und fügen Sie Variablen (Werte) nach Bedarf hinzu.

Gibt es eine Thread-sichere Möglichkeit, dies zu tun, um sicherzustellen, dass, wenn ein Thread eine Variable anfordert, ich sicher sein kann, dass es den richtigen Wert bekommt?

Danke.

+1

Schon mal von Sperren und Synchronisation gehört? Bearbeiten: Erste Ressource, die in den Sinn kommt: http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html – Corbin

+0

Ich werde es erforschen. Vielen Dank. Irgendwelche anderen Ressourcen, die ich lesen kann? – rob345

+0

Viele von ihnen, aber keine, die mir aus dem Kopf fallen. Sie können wahrscheinlich googlen und einige Empfehlungen für gute Bücher finden, oder Sie können googlen und Tutorials finden. Tatsächlich sollte dieser Link, den ich eingefügt habe, alle Ihre Bedürfnisse abdecken, da der Zugriff auf Strings im Bereich der gleichzeitigen Probleme sehr einfach ist. – Corbin

Antwort

2

Sie wissen, ich werde auf eine Extremität gehen und sagen, eine ConcurrentHashMap verwenden. Es ist eine der besten Möglichkeiten, Konflikte mit vielen gleichzeitigen Informationen zu minimieren, die einen Disruptor blockieren. Da Sie sowieso eine HashMap in Erwägung ziehen, ist der Vorteil hier, dass das Sperren, das auftritt, auf die einzelnen Hash-Zeilen beschränkt ist - zwei Elemente, die sich in verschiedenen Regionen haseln, blockieren sich nicht gegenseitig.

+0

die beste Antwort, und eine ConcurrentHashMap scheint am besten zu funktionieren. Vielen Dank. – rob345

0

Wenn Ihre Variablen gespeichert werden müssen (dh nichtflüchtig) Ich denke, Sie sollten nur ein ACID DBMS (MySQL, PostgreSQL oder was immer Sie bevorzugen) und lassen Sie einfach das DBMS die Nebenläufigkeit behandeln.

Wenn Sie befürchten, dass I/O ein Performance-Problem sein wird, bieten die meisten ORM-Frameworks sowohl Lazy-Reading-Mechanismen als auch Lese-/Schreib-Caches, die ebenfalls Multi-Thread-sicher sind (zB Hibernate oder MyBatis).