Der Schnellste Weg für Java zu schreiben, Mutexe?
Mutexe sind sehr verbreitet in vielen Programmiersprachen, wie z.B. C/C++. Ich vermisse Sie in Java. Es gibt jedoch mehrere Möglichkeiten, ich könnte schreiben, dass meine eigenen class Mutex
:
- Mit einem einfachen synchronized-Schlüsselwort auf
Mutex
. - Mit einem binäre semaphore.
- Verwendung von atomaren Variablen, wie besprochen hier.
- ...?
Was ist der Schnellste (beste Laufzeit) Weg? Ich denke synchronisiert ist am häufigsten, aber was ist mit Leistung?
Sie Taten es für Sie zu lösen, indem hinzufügen
Tun Sie sich einen gefallen und bitte erwägen Sie, dieses Buch zu Lesen: " Java Concurrency in practice es ist das - Buch über Parallelität in Java. Wenn Sie nicht denken, Sie brauchen, um dieses Buch zu Lesen, bitte Vorhersagen, das Ergebnis des folgenden code-snippet: Was tun... Hinweis es gibt mehr als eine Möglichkeit... Tipp es gibt mehr als zwei Möglichkeiten... alle von Ihnen gültig... zu verstehen, warum das Buch Lesen...
synchronized
.Tun Sie sich einen gefallen und bitte erwägen Sie, dieses Buch zu Lesen: " Java Concurrency in practice es ist das - Buch über Parallelität in Java. Wenn Sie nicht denken, Sie brauchen, um dieses Buch zu Lesen, bitte Vorhersagen, das Ergebnis des folgenden code-snippet: Was tun... Hinweis es gibt mehr als eine Möglichkeit... Tipp es gibt mehr als zwei Möglichkeiten... alle von Ihnen gültig... zu verstehen, warum das Buch Lesen...
InformationsquelleAutor Johannes | 2013-01-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht sicher, ob ich dir Folgen (vor allem, weil du gibst die Antwort in deiner Frage).
Alternativ können Sie einfach die gesamte Methode synchronisiert, die gleichwertig ist mit
this
als das mutex-Objekt:Erwerb /loslassen ein monitor ist nicht dabei, um eine erhebliche performance-Problem per se (Sie können Lesen in diesem blog-post, um zu sehen, eine Analyse der Auswirkungen). Aber wenn Sie viele threads kämpfen für das Schloss, es wird zu Konflikten und beeinträchtigen die Leistung.
In diesem Fall die beste Strategie ist nicht zu verwenden, Mutexe durch die Verwendung von "lock-free" - algorithmen wenn Sie sind meist die Daten zu Lesen (wie bereits von Marko in den Kommentaren, lock-frei verwendet CAS-Operationen, welche möglicherweise beinhalten, wiederholt schreibt, viele Male, wenn Sie viel schreiben-threads, die schließlich führt zu schlechter Leistung), oder noch besser, durch die Vermeidung zu teilen, zu viel Zeug auf mehrere threads.
Ich habe einige Informationen, aber Sie brauchen, um zu definieren "Schnellste".
Lock-freien code funktioniert am besten für Lesen-heavy-Szenarien; write-heavy-Szenarien tatsächlich schlechter dastehen, ohne sperren durch die übermäßige Wiederholung.
Ja, guter Punkt.
In meinem Fall ist es normalerweise das gleichzeitige Lesen und schreiben (beide in etwa der gleichen Höhe) in Daten-Strukturen.
InformationsquelleAutor assylias
Das Gegenteil ist der Fall: Java-Designer gelöst so gut, dass Sie nicht einmal erkennen Sie: Sie brauchen keinen erste-Klasse
Mutex
Objekt, genauso diesynchronized
modifier.Wenn Sie einen besonderen Fall, wo Sie wollen zu jonglieren, Ihre Mutexe im nicht-nesting-Mode, es gibt immer die
ReentrantLock
undjava.util.concurrent
bietet auch eine fülle von Synchronisations-tools gehen weit über die Rohöl-mutex.Wie ich unten kommentiert asyliass Antwort es hängt davon ab,.
InformationsquelleAutor Marko Topolnik
In Java jedes Objekt kann verwendet werden als Mutex.
Diese Objekte sind arttypisch mit dem Namen "lock" oder "mutex".
Können Sie erstellen das Objekt für sich, das ist die bevorzugte Variante, da es verhindert den externen Zugriff auf das lock:
Schneller ist zu vermeiden, den mutex, indem wir denken, was passiert, wenn ein anderer thread liest eine nicht den tatsächlichen Wert. In einigen Situationen würde die Produktion falscher Rechenergebnisse, die in anderen Ergebnisse nur in einer minimalen Verzögerung. (aber schneller als mit der Synchronisierung)
Ausführliche Erklärung im Buch
.
InformationsquelleAutor AlexWien
Dass hängt von vielen Dingen ab. Zum Beispiel,
ReentrantLock
verwendet, um eine bessere Leistung unter Streit als mitsynchronized
, aber das änderte sich, als eine neue HotSpot-version, Optimierungsynchronized
sperren, veröffentlicht wurde. So gibt es nichts inhärent in jeder Art von sperren, die er bevorzugt eine Art von Mutexe über die anderen (aus einer performance-Sicht) - in der Tat, die "beste" Lösung ändern kann mit den Daten, die Sie verarbeiten und die Maschine laufen Sie, auf.Die Sie haben - in mehrfacher Hinsicht:
synchronized
,Lock
s, Atomare Variablen, und eine ganze Reihe von anderen Versorgungsunternehmen injava.util.concurrent
.InformationsquelleAutor gustafc
Können Sie führen Sie die micro-benchmarks von jeder Variante, wie Atomare, synchronisierte, gesperrt. Wie andere haben darauf hingewiesen, es hängt viel an der Maschine und die Anzahl der verwendeten threads an. In meiner eigenen Experimente, die Inkrementierung von langen Ganzzahlen, fand ich, dass mit nur einem thread auf einem Xeon W3520, synchronisiert gewinnt über atomic: Atomic/Sync/Lock: 8.4/6.2/21.8 in nanos pro Inkrement-operation.
Dies ist natürlich eine Grenze, da gibt es nie Streit. Natürlich, in diesem Fall können wir auch einen Blick auf nicht synchronisierte single-threads lange Schrittweite, die sechs mal schneller als Atom.
Mit 4 threads, die ich bekommen 21.8/40.2/57.3. Beachten Sie, dass diese sind alle Schritten quer durch alle threads, so dass wir tatsächlich sehen, eine Verlangsamung. Es wird ein bisschen besser für Schlösser mit 64 threads: 22.2/45.1/45.9.
Ein weiterer test auf eine 4-Weg/64T-Maschine mit Xeon E7-4820-Renditen für 1 thread: 9.1/7.8/29.1, 4 threads: 18.2/29.1/55.2 und 64 Threads: 53.7/402/420.
Eine weitere Datenpunkt, dieses mal ein dual Xeon X5560, 1T: 6.6/5.8/17.8, 4T: 29.7/81.5/121, 64T: 31.2/73.4/71.6.
Also, auf einer multi-sockel-Maschine, es ist ein schwerer cache-Kohärenz-Steuer.
InformationsquelleAutor Ralf H
können Sie java.util.gleichzeitige.sperren.Sperre in der gleichen Weise wie der mutex oder java.util.gleichzeitige.Semaphore. Aber mit synchronized-Schlüsselwort ist der bessere Weg 🙂
Grüße
Andrej
InformationsquelleAutor thinker