Der Frühling und die Synchronisation für einen Teil der Methode
Ich habe einen manager, wie der Frühling WLAN-bean. Ich glaube, dass jeder bean definiert für den Frühling standardmäßig verdrahtet ist als singleton. Ich habe einige Methoden in der bean, die ich brauche, um zu synchronisieren.
Wie sollte ich das machen dann --
void zzz() {
synchronized (this) {
...
}
}
oder
void zzz() {
synchronized (MyClass.class) {
...
}
}
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Hauptunterschied in den beiden ist, dass im ersten Fall die Instanz der Klasse, als der monitor und der zweite verwendet die Klasse wie der monitor.
Die erste ist wahrscheinlich der Weg zu gehen, in Ihrem Fall, weil Sie, in Naher Zukunft, wenn Sie sich entscheiden, müssen viele Instanzen der Klasse, deren Methoden synchronisiert werden, die auf die jeweiligen Instanzen. Im Gegensatz zu, wenn Sie eine Klasse verwenden, die als ein monitor, wenn ein thread ruft eine synchronisierte Methode auf eine Instanz, keine anderen threads werden in der Lage sein, um Methoden aufzurufen sind (diejenigen, die synchronisiert sind) auf alle Instanzen der gleichen Klasse.
Es sei denn, du hast Zugriff auf die mutable statische Klassenvariablen (potentiell bösen, um mit zu beginnen), die erste ist der geeignete Weg, um zu synchronisieren.
Verstehen, dass, während die Feder ist nur bei der Erstellung einer Instanz eines singleton-bean und verwenden Sie es für alle, die eine Abhängigkeit von einer Bohne, der Typ, der singleton ist nicht ein statisches gebilde. Es gibt keine compiler-Einschränkung verhindert, dass Sie instanziieren die Klasse sich außerhalb der Spring-Kontext. Es ist einfach die einzige Instanz, weil der Frühling weiß, dass Sie nicht mehr von Ihnen... nicht, weil es nicht getan werden kann. Der Punkt, den ich versuche zu machen ist hier, dass es zweifelhaft grenzt an falsch, parallelen zu ziehen zwischen Klasse-level-Daten und die singleton-Daten.
In Verknüpfung mit der Synchronisierung auftreten sollten auf den engsten Bereich möglich. In Ihrem Fall bedeutet, dass die Synchronisierung auf das Objekt-Instanz enthält die gemeinsam verwendeten Daten, anstatt sich auf die breiteren Bereich der gesamten Klasse.