Heim  >  Artikel  >  Java  >  Java führt acht Sperren ein, um Ihnen das Verständnis von Objektsperren und Klassensperren zu erleichtern

Java führt acht Sperren ein, um Ihnen das Verständnis von Objektsperren und Klassensperren zu erleichtern

coldplay.xixi
coldplay.xixinach vorne
2021-02-09 18:06:233419Durchsuche

Java führt acht Sperren ein, um Ihnen das Verständnis von Objektsperren und Klassensperren zu erleichtern

Verwandte kostenlose Lernempfehlungen: Java-Basis-Tutorial

8-Sperrproblem-Demonstration

1. Standardzugriff

rrree

Java führt acht Sperren ein, um Ihnen das Verständnis von Objektsperren und Klassensperren zu erleichtern
Standardzugriff , drucken Sie zuerst die E-Mail aus oder schreiben Sie eine SMS Nachrichten.
Es spielt keine Rolle, wer zuerst gedruckt wird. Es hängt von der Ausführung der CPU ab. Es ist der Hauptthread, der sie aktiviert.
Um den Effekt sicherzustellen, fügen wir thread.sleep (100) zwischen den Codes von A und B ein. Zu diesem Zeitpunkt können wir sicherstellen, dass A zuerst gedruckt wird.
Erklärung:
Solange es eine Ressourcenklasse gibt, egal wie viele Synchronisationsmethoden sie hat, solange ein Thread zuerst auf eine Synchronisationsmethode in der Ressourcenklasse zugreift, wird diese Methode nicht gesperrt, sondern die Methode wo Die Methode befindet sich in der gesamten Ressourcenklasse. Mit anderen Worten: Was gesperrt ist, ist das Objekt. Was gesperrt wird, ist nicht die aktuelle Methode.
Mit anderen Worten: Diese synchronisierten Methoden gehören alle zur gleichen Ressourcenklasse und sperren die gesamte Ressourcenklasse.

2. Halten Sie bei der E-Mail-Methode 4 Sekunden lang inne. Bitte drucken Sie zuerst die E-Mail oder Textnachricht aus. Die durch die Synchronisierungsmethode erhaltene Telefonobjektsperre wird durch den Ruhezustand nicht aufgehoben. Es wird sofort ausgeführt, wenn es soweit ist. Drucken Sie also zuerst die E-Mail-Methode aus. Erklärung:

Es ähnelt Frage 1.


Solange es eine Ressourcenklasse gibt, egal wie viele Synchronisationsmethoden sie hat, solange ein Thread zuerst auf eine Synchronisationsmethode in der Ressourcenklasse zugreift, wird diese Methode nicht gesperrt, sondern die gesamte Ressourcenklasse, in der sie vorhanden ist Methode liegt. Mit anderen Worten: Was gesperrt ist, ist das Objekt. Was gesperrt wird, ist nicht die aktuelle Methode.

Zum Beispiel: Der Monitor und ich müssen dasselbe Mobiltelefon verwenden, um einen Anruf zu tätigen. Ich muss warten, bis der Monitor den Anruf beendet hat, bevor ich den Anruf fortsetzen kann. Der Monitor war eine Zeit lang nicht angeschlossen, während er ihn benutzte, sodass ich nur warten konnte, bis der Monitor fertig war.
3. Fügen Sie eine normale sayHello-Methode hinzu. Bitte drucken Sie zuerst die E-Mail aus . Daher muss nicht auf die Freigabe der Synchronisationssperre gewartet werden.

Hier ist ein Beispiel. Der Monitor benutzte sein Mobiltelefon, um einen Anruf zu tätigen. Und ich möchte vom Truppführer ein Handy-Ladekabel ausleihen. Beides schließt sich nicht aus, ich kann mir also das Ladekabel ausleihen, bevor der Truppführer mit dem Anruf fertig ist.

4. Zwei Mobiltelefone, bitte drucken Sie zuerst die E-Mail oder SMS aus

/*手机类可以发邮件和发短信*/class Phone{
	public synchronized void sendEmail() throws Exception{
		System.out.println("***sendEmail");
	}
	public synchronized void sendSMS() throws Exception{
		System.out.println("***sendSMS");
	}}public class Lock8Demo {
	public static void main(String[] args) throws InterruptedException {
		//创建一个资源类
		Phone phone=new Phone();
		new Thread(()->{
			try {
				phone.sendEmail();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		},"A").start();
		Thread.sleep(100);
		new Thread(()->{
			try {
				phone.sendSMS();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		},"B").start();
	}}

Java führt acht Sperren ein, um Ihnen das Verständnis von Objektsperren und Klassensperren zu erleichtern
Erläuterung: Hier ist ein Beispiel, um E-Mails zu versenden. Ich habe auf meinem eigenen Handy angerufen. Dann ist es egal, wer zuerst und wer zuletzt kommt.

5. Zwei statische Synchronisierungsmethoden, dasselbe Mobiltelefon. Soll ich zuerst die E-Mail oder SMS ausdrucken? Mit anderen Worten: Er gehört nicht zu einem unabhängigen Individuum des aktuellen Objekts. Es ist eine globale Klasse. Dies erfordert die Berücksichtigung des Unterschieds zwischen Objektsperren und globalen Sperren. Globale Sperren sind Klassensperren. Derzeit stammen alle aus derselben Telefonklasse, unabhängig davon, ob es sich um ein Telefon oder mehrere Telefone handelt. Egal welches Objekt Sie jetzt sperren, ich muss warten, bis es die Sperre aufhebt, bevor es verwendet werden kann.

7.1 statische Synchronisierungsmethode, 1 normale Synchronisierungsmethode, dasselbe Telefon, bitte drucken Sie zuerst die E-Mail oder SMS aus

/*手机类可以发邮件和发短信*/class Phone{
	public synchronized void sendEmail() throws Exception{
		TimeUnit.SECONDS.sleep(4);		//表示暂停4秒,它是一个枚举类型
		System.out.println("***sendEmail");
	}
	public synchronized void sendSMS() throws Exception{
		System.out.println("***sendSMS");
	}}public class Lock8Demo {
	public static void main(String[] args) throws InterruptedException {
		//创建一个资源类
		Phone phone=new Phone();
		new Thread(()->{
			try {
				phone.sendEmail();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		},"A").start();
		Thread.sleep(100);
		new Thread(()->{
			try {
				phone.sendSMS();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		},"B").start();
	}}
Java führt acht Sperren ein, um Ihnen das Verständnis von Objektsperren und Klassensperren zu erleichtern

Eine statische und eine normale. Das gleiche Telefon ist gesperrt. Die statische Methode sperrt die Klasse. Dies entspricht dem Sperren eines Schultors und einer normalen Synchronisierungsmethode, die das aktuelle Objekt sperrt. Zum Beispiel normale Lehrer. Die Objekte des Schlosses sind unterschiedlich. Kein Konflikt

8.1 statische Synchronisierungsmethode, 1 normale Synchronisierungsmethode, zwei Mobiltelefone, bitte drucken Sie zuerst die E-Mail oder SMS aus

/*手机类可以发邮件和发短信*/class Phone{
	public synchronized void sendEmail() throws Exception{
		TimeUnit.SECONDS.sleep(4);		//表示暂停4秒,它是一个枚举类型
		System.out.println("***sendEmail");
	}
	public synchronized void sendSMS() throws Exception{
		System.out.println("***sendSMS");
	}
	public void sayHello(){
		System.out.println("***sayHello");
	}}public class Lock8Demo {
	public static void main(String[] args) throws InterruptedException {
		//创建一个资源类
		Phone phone=new Phone();
		new Thread(()->{
			try {
				phone.sendEmail();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		},"A").start();
		Thread.sleep(100);
		new Thread(()->{
			try {
				//phone.sendSMS();
				phone.sayHello();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		},"B").start();
	}}

Java führt acht Sperren ein, um Ihnen das Verständnis von Objektsperren und Klassensperren zu erleichtern

Erklärung: Dies ist das Gleiche wie oben.

8 Erklärung der Schlosstheorie

1. Wenn ein Objekt mehrere synchronisierte Methoden enthält, können andere Threads nur warten, solange ein Thread zu einem bestimmten Zeitpunkt eine der synchronisierten Methoden aufruft um auf diese synchronisierten Methoden zuzugreifen.
Das aktuelle Objekt ist gesperrt, andere Threads können keine anderen synchronisierten Methoden des aktuellen Objekts eingeben.

Nach dem Hinzufügen einer normalen Methode habe ich festgestellt, dass dies nichts mit der Synchronisationssperre zu tun hat.
Nach dem Austausch zweier Objekte handelt es sich nicht mehr um dasselbe Schloss und die Situation ändert sich sofort.
Nach dem Wechsel zu statischen Synchronisierungsmethoden änderte sich die Situation sofort.
Alle nicht statischen Synchronisierungsmethoden verwenden dieselbe Sperre – das Instanzobjekt selbst.

2 Die Grundlage für die synchronisierte Implementierung der Synchronisierung: jedes Objekt in Java können als Schlösser verwendet werden.
Konkret manifestiert sich dies in den folgenden 3 Formen:

  1. Bei gewöhnlichen Synchronisationsmethoden ist die Sperre das aktuelle Instanzobjekt.
  2. Bei Synchronisationsmethodenblöcken ist die Sperre das in synchronisierten Klammern konfigurierte Objekt.
    Schreiben Sie beispielsweise
    synchronisiert(this){
    }
  3. in die Methode. Bei statischen Synchronisierungsmethoden ist die Sperre das Klassenobjekt der aktuellen Klasse.

Wenn ein Prozess versucht, auf einen synchronisierten Codeblock zuzugreifen, muss er zuerst die Sperre erhalten, und beim Beenden oder Auslösen einer Ausnahme muss die Sperre aufgehoben werden.
Das heißt, nachdem die nicht statische Synchronisationsmethode eines Instanzobjekts die Sperre erworben hat, müssen andere nicht statische Synchronisationsmethoden des Instanzobjekts darauf warten, dass die Methode, die die Sperre erworben hat, die Sperre aufhebt, bevor sie die Sperre erwerben können . Da jedoch die nicht statischen Synchronisationsmethoden anderer Instanzobjekte andere Sperren als die nicht statischen Synchronisationsmethoden des Instanzobjekts verwenden, können sie ihre eigenen Sperren erwerben, ohne auf die nicht statische Synchronisationsmethode des erworbenen Instanzobjekts warten zu müssen die Sperre, um die Sperre zu lösen.

Alle statischen Synchronisationsmethoden verwenden auch dieselbe Sperre – das Klassenobjekt selbst.
Die beiden Sperren sind zwei verschiedene Objekte, daher gibt es keine Wettlaufbedingungen zwischen statischen Synchronisationsmethoden und nicht statischen Synchronisationsmethoden. (Frage 78). Das heißt, es gibt eine Sperrklasse und eine Sperre, und die beiden stehen nicht in Konflikt.
Aber sobald eine statische Synchronisationsmethode die Sperre erlangt, müssen andere statische Synchronisationsmethoden warten, bis die Methode die Sperre aufhebt, bevor sie die Sperre erlangen können. Unabhängig davon, ob es sich um statische Methoden desselben Instanzobjekts oder um statische Synchronisationsmethoden verschiedener Instanzobjekte handelt, sofern es sich um Instanzobjekte derselben Klasse handelt. (Frage 56)

Das obige ist der detaillierte Inhalt vonJava führt acht Sperren ein, um Ihnen das Verständnis von Objektsperren und Klassensperren zu erleichtern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen