Wenn ein Java -Sprachschlüsselwort verwendet wird, um eine Methode oder einen Codeblock zu ändern, kann sichergestellt werden, dass der Code höchstens ein Thread gleichzeitig ausführt.
1. Verwenden Sie es, wenn Sie die Methode nach dem Zielfernrohr (öffentlich usw.) deklarieren, vor der Rückgabetypdeklaration (void usw.). Geben Sie die Methode gleichzeitig ein und andere Threads, wenn Sie diese Methode zu diesem Zeitpunkt aufrufen möchten, können Sie erst nach dem aktuellen Thread (dh der Thread in der synchronisierten Methode) warten, die die Methode, andere Threads, ausgeführt hat. kann eintreten.
Zum Beispiel:
public synchronisierte void synmeThod () {// Methode Body}2. Synchronisierte, gefolgt von Klammern, und in dieser Zeit sind Variablen in Klammern enthalten.
public int synmeThod (int a1) {synchronisiert (a1) {// Nur ein Thread kann gleichzeitig eingeben}} 3. Nach der Synchronisierung gibt es ein Objekt in den Klammern.
öffentliche Klasse MyThread implementiert runnable {public static void main (String args []) {mythead mt = new mythead (); ) Thread = neuer Thread (MT, "T3"); t6 "); t1.start (); t2.start (); t3.start (); t4.start (); t5.start (); t6.start ();} public void run () {synchronisiert (diese ) {System.out.println (Thread.CurrentThread (). GetName ());Wenn der Thread eingeht, wird die aktuelle Objektsperrung angezeigt, und dann können alle Operationen anderer Threads auf allen Objekten in der Klasse nicht durchgeführt werden. Warum das gesamte Objekt sperren, ohne dass andere Threads andere Synchronisationsmethoden im Objekt kurz verwenden, um auf gemeinsame Ressourcen zuzugreifen? Wenn ein Objekt über mehrere Ressourcen verfügt, muss nicht alle Threads außerhalb des Threads gesperrt werden, nur um einen Thread einige der Ressourcen zu verwenden. Da jedes Objekt über ein Schloss verfügt, können Sie ein virtuelles Objekt verwenden, um es wie folgt zu sperren:
Klasse FineGrainlock {MyMemberClass x, y; Verwenden Sie Shared Ressourcen Synchronized (ylock) {// Zugriff y hier}} public void bar () {synchronisiert (this) {// Zugriff sowohl X als auch Y hier} // DO etwas, aber verwenden }4. Die Klasse befindet sich in den Klammern nach der Synchronität.
Class ArrayWithLockOrder {private statische num_locks = 0; / Fügen Sie 1 zur Sperrennummer hinzu. lock_order = num_locks; }} public long lockorder () {return lock_order; ; int size = a1.array (). Länge; // Befehl. First = A2; synchronisiert (letztes) {int [] arr1 = a1.Array (); i];}}} Rückgabewert;Wenn der Thread eingeht, können in der Klasse nicht alle Operationen im Thread durchgeführt werden, einschließlich statischer Variablen und statischer Methoden.
PS: Synchronisierte Verwendungszusammenfassung
Synchronisierte verwendet verschiedene Orte, um den Code zu beeinflussen:
1. Synchronisierte Methode für die Änderung der Schlüsselwortwörter
Unter der Annahme, dass P1 und P2 unterschiedliche Objekte derselben Klasse sind, definiert diese Klasse den Synchronisationsblock oder die Synchronisationsmethode in den folgenden Situationen, und P1 und P2 können sie aufrufen.
public synchronisierte void -Methode () {//}Dies ist die Synchronisationsmethode. Das heißt, wenn ein Objekt P1 diese Synchronisationsmethode in verschiedenen Threads ausführt, bilden sie einen gegenseitigen Ausschluss, um den Effekt der Synchronisation zu erreichen. Gleichzeitig dürfen andere Synchronisationsmethoden im Objekt nicht von anderen Threads ausgeführt werden, wenn ein Thread im Objekt mehrere Synchronisationsmethoden im Objekt ausführt, wenn ein Thread eine synchronisierte Methode ausführt. Ein weiteres Objekt P2, das von der Klasse generiert wird, zu der dieses Objekt gehört, kann diese Methode mit dem hinzugefügten synchronisierten Schlüsselwort willkürlich willkürlich aufrufen.
Der obige Beispielcode entspricht dem folgenden Code:
public void method () {synchronized (this) {// ..}}Diesmal handelt es sich um eine P1 -Objektschloss. .
2. Synchronisieren Sie Blöcke, der Beispielcode lautet wie folgt:
public void method () {synchronized (this) {// ..}}Zu diesem Zeitpunkt ist das Schloss das SO -Objekt, und jedes Objekt entspricht einer eindeutigen Sperre. Wen auch immer der Thread diese Objektschloss erhält, kann den von ihm kontrollierten Code ausführen. Wenn es ein klares Objekt als Schloss gibt, können Sie das Programm wie dieses schreiben. Wenn es jedoch kein klares Objekt als Sperre gibt, möchten Sie nur, dass ein Code -Stück eine Synchronisierung einer speziellen Instanzvariablen erstellen kann (es muss sein ein Objekt) als Schloss zu fungieren:
private byte [] lock = new Byte [0];
HINWEIS: Byte-Array-Objekte von Nulllängen sind wirtschaftlicher als jedes Objekt.
3. Verwenden Sie die synchronisierte bis statische Funktion. Der Beispielcode lautet wie folgt:
Klasse foo {public synchronisierte statische Void -Methode1 () {//. Beide synchronen Methoden nennen die Klassenschloss der Klasse, zu der das Objekt dieser Methode gehört (Klasse, kein bestimmtes Objekt mehr, das von dieser Klasse generiert wird).
Es kann abgeleitet werden, dass, wenn eine Klasse eine synchronisierte statische Funktion A definiert und auch eine synchronisierte Instanzfunktion B definiert, dieselbe Objekt -OBJ dieser Klasse keine Methode A bzw. B darstellt Synchronisieren, weil ihre Schlösser unterschiedlich sind. Die Methodeschloss A ist die Klasse, zu der OBJ gehört, und das Schloss von B ist das Objekt, zu dem OBJ gehört.