So sperren Sie eine Methode für die ganze Klasse mit synchronisiert?
Weiß ich, wenn Sie wollen lock-Methode ausgeführt werden, indem nur ein thread deklarieren Sie es mit synchronized
Schlüsselwort.
Was über die Klassen, wie man eine Sperre für eine ganze Klasse von Objekten, wenn ein thread
ist die Ausführung von code auf eine Instanz der Klasse?
In anderen Worten, wenn ein thread eine Methode auf ein Objekt, von keinem anderen thread werden sollte
ausgeführt werden darf die gleiche Methode, die auch auf einer anderen Instanz der gleichen Klasse.
- Können Sie erklären, warum Sie dies tun müssen? Ich habe das Gefühl, dass Sie vielleicht Angriff auf das falsche problem. Dass synchronize-Methode aufrufen für völlig unterschiedliche Instanzen der Klasse klingt, das eigentliche Problem woanders ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Synchronisieren auf ein bestimmtes Objekt, entweder einige bestimmten statisches lock-Objekt, oder das Objekt der Klasse (was passiert, wenn statische Methoden deklariert sind, werden synchronisiert):
Jede Variante hat seine eigenen vor-und Nachteile; verriegeln auf die Klasse erlaubt es anderen code, außerhalb der Klasse zu verwenden, die gleiche Sperre für seine eigenen Gründe (die es erlaubt zu orchestrieren mehr high-level-Synchronisation als das, was Sie bieten), während die
static final Object lock
Ansatz ermöglicht es Ihnen verbietet, indem Sie die lock-Feld "privat" (was es leichter macht, auf Grund über das Sperr-und vermeiden Sie Ihr code von Deadlocks, weil jemand anderes schrieb schlechten code).Könnte man natürlich auch einige Synchronisations-Mechanismus von
java.util.gleichzeitige
, wie expliziteLock
s, die mehr Kontrolle über die Verriegelung (und dieReentrantLock
führt momentan ein wenig besser als implizite sperren unter hohem Streit -).Edit: Beachten Sie, dass statische/Globale sperren sind nicht ein guter Weg zu gehen - es bedeutet, dass jede Instanz der Klasse, die jemals geschaffen werden, im wesentlichen gebunden werden, um jede andere Instanz (die, abgesehen davon macht es schwieriger, um zu testen, oder Lesen Sie den code, können ernsthaft Schaden Skalierbarkeit). Ich nehme an, Sie tun dies, um zu synchronisieren, die irgendeine Art von globaler Zustand? In diesem Fall würde ich prüfen, - Verpackung, die globalen/statischen Zustand in einer Klasse statt, und implementieren Synchronisation per-instance statt Global.
Sondern so etwas wie dieses:
Machen Sie es wie diese:
Nun
foo
undbar
sind immer noch aneinander gefesselt, aber Sie können selbständig arbeitenfrob
undquux
.Wenn Sie statische synchronisierte Methoden, Sie sind gesperrt, über die Klasse Lock. Sie können auch erklären, ein statisches Objekt in der Klasse und Schloss, dass in einer Methode, die ich glaube, über so etwas wie:
Könnte man eine statische
Mutex
innen diese Methode. Also der gleichzeitigen thread wird blockiert innerhalb der Methode, während eine andere läuft, ist es egal, welches Objekt von der Klasse zu der er gehört. Ich glaube nicht, dass es irgendwelche besonderen einzelnes keyword zu produzieren, die gleiche Wirkung wiesynchronized
.Ist es eine eher aggressive Synchronisation, ich würde es vermeiden, so viel wie möglich.
Synchronisieren auf statisches Feld der Klasse oder die Klasse selbst:
Beide threads verwenden müssen, diese Konstruktion
Dieser Ansatz profitiert von der Tatsache, dass die Klasse selbst ist ein Objekt und hat daher einen monitor. Dann brauchen Sie nicht jede künstliche statische Instanz.
Gibt es keinen eingebauten Mechanismus für diese. Erstellen Sie Ihre eigene statische lock-Attribut, und stellen Sie sicher, dass Sie sperren und entsperren es in jeder Methode. Vergessen Sie nicht über Ausnahmen - stellen Sie sicher, dass Sie es entsperren, in dem "endlich" - Abschnitte.
Sollte dies funktionieren:
Die 'missuses' der Klasse runtime-Darstellung für die Verriegelung. Dies ist möglich, da jedes Objekt kann verwendet werden, als eine mutex in Java.
http://www.janeg.ca/scjp/threads/synchronization.html
spricht über mehrere Möglichkeiten, es zu erreichen.
im Allgemeinen, die Schleusen sind zu hoch und behindern Vorteile von threading. so ist der kritische code sollte minimiert werden, so viel wie möglich seine.
wollen Sie einen Klasse Hebel-lock, um den Zugriff auf statische Variablen der Klasse, oder ist es für den Schutz Zugriff auf einen gemeinsamen externen Ressource der Klasse? in diesem Fall sollten Sie proly haben eine separate Sperre beim Zugriff auf Sie.