Dies kann ein ganz normaler Befund sein, abhängig davon, was Sie gerade tun und was Sie als Alternative zu Locks verwenden.
Im Wesentlichen, was passiert, ist, dass Konstrukte wie ReentrantLock eine gewisse Logik eingebaut haben, die weiß, wann sie sich zurückziehen müssen, wenn sie das Schloss realistischerweise nicht erfassen können. Dies reduziert die CPU-Menge, die gerade in der Logik des wiederholten Zugriffs auf die Sperre verbraucht wird. Dies kann passieren, wenn Sie einfachere Sperrkonstrukte verwenden.
Als Beispiel, werfen Sie einen Blick auf die Grafik, die ich eilig here gestellt habe. Es zeigt den Durchsatz von Threads, die kontinuierlich auf zufällige Elemente eines Arrays zugreifen, wobei verschiedene Konstrukte als Sperrmechanismus verwendet werden. Entlang der X-Achse ist die Anzahl der Threads; Y-Achse ist der Durchsatz. Die blaue Linie ist ein ReentrantLock; die gelben, grünen und braunen Linien verwenden Varianten eines Spinlocks. Beachten Sie, dass der Spinlock bei geringer Anzahl von Threads einen höheren Durchsatz bietet, wie Sie vielleicht erwarten würden, aber wenn die Anzahl der Threads steigt, wird die Back-Off-Logik von ReentrantLock aktiviert und es geht besser, während bei hohen Constraints die Spinlocks sitzen nur brennende CPU.
Übrigens war dies wirklich ein Testlauf auf einem Dual-Prozessor-Maschine; Ich habe es auch in der Amazon Cloud (effektiv ein 8-Wege Xeon) ausgeführt, aber ich habe ahem ... die Datei verlegt, aber ich werde es entweder finden oder das Experiment bald wieder ausführen und ein Update trainieren und posten. Aber Sie erhalten ein im Wesentlichen ähnliches Muster, wie ich mich erinnere.
Update: ob es in Code Sperren oder nicht, ein Phänomen, das auf einigen Multi-Prozessor-Architekturen passieren kann, ist, dass, da die mehrere Prozessoren ein hohes Volumen an Speicher tun zugreift, können Sie den Speicher-Bus am Ende überschwemmen, und in bewirken, dass sich die Prozessoren gegenseitig verlangsamen.(Es ist ein bisschen wie mit Ethernet - je mehr Maschinen Sie dem Netzwerk hinzufügen, desto größer ist die Wahrscheinlichkeit von Kollisionen, wenn Daten gesendet werden.)
Das ist ein schöner Fund. Aber was ist mit dem Entfernen der Schlösser insgesamt? Soll das die Performance nicht verbessern ?? – pankajt
Es hängt davon ab - wenn Sperren erforderlich war, damit das Programm korrekt funktioniert und Sie es nur willkürlich entfernt haben, was ist dann Ihre Messung der "Leistung" und wie gültig ist sie? Es ist schwer zu sagen, ohne mehr darüber zu wissen, was Sie tun und die Architektur, auf der Sie laufen ... –
Siehe auch mein Update über Speicherbus-Flooding: Wenn mehrere Prozessoren Speicher mit einer hohen Anzahl von Schreibvorgängen hämmern, dann können sie können sich gegenseitig negativ beeinflussen. Ich sage nicht, dass dies notwendigerweise ist, was passiert - aber es ist ein Beispiel dafür, wie die Dinge ziemlich komplex sind, und Sie erwarten nicht unbedingt "Sperren entfernen", um die Leistung magisch zu steigern ... –