Heim  >  Artikel  >  Java  >  Beispielanalyse der Synchronisation und Asynchronität von Objekten in Java-Threads

Beispielanalyse der Synchronisation und Asynchronität von Objekten in Java-Threads

黄舟
黄舟Original
2017-07-20 14:16:021976Durchsuche

Der folgende Editor bringt Ihnen einen Artikel über die Synchronisation und Asynchronität von Java-Thread-Objekten (Erklärung mit Beispielen). Der Herausgeber findet es ziemlich gut, deshalb werde ich es jetzt mit Ihnen teilen und es allen als Referenz geben. Folgen wir dem Editor und werfen wir einen Blick auf

1. Synchronisation und Asynchronität in einer Multithread-Umgebung

Synchronisation : Thread A möchte eine Ressource anfordern, aber diese Ressource wird von Thread B verwendet. Aufgrund des Synchronisierungsmechanismus kann Thread A sie nicht anfordern. Was soll ich tun?


package com.jalja.org.thread.demo01;

public class Thread02 {
 public synchronized void method1(){
  System.out.println("method1:"+Thread.currentThread().getName());
  try {
   Thread.sleep(3000);
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
 }
 public synchronized void method2(){
  System.out.println("method2:"+Thread.currentThread().getName());
 }
 public static void main(String[] args) {
  final Thread02 th=new Thread02();
  Thread thread1=new Thread(new Runnable() {
   public void run() {
    th.method1();
   }
  },"th1");
  
  Thread thread2=new Thread(new Runnable() {
   public void run() {
    th.method2();
   }
  },"th2");
  
  thread1.start();
  thread2.start();
 }
}

Beobachten Sie die Ausgabe: method1:th1 gibt method2:th2 nach 3 Sekunden aus. Dies liegt daran, dass method2() und method1() beide synchrone Methoden und Threads sind Thread1 und Thread2 arbeiten mit demselben Objekt. Wenn Thread2 also die Methode method2 () ausführt, muss er zuerst die Sperre des Objekts erhalten.

Asynchron: Thread A möchte eine Ressource anfordern, aber diese Ressource wird von Thread B verwendet. Da es keinen Synchronisierungsmechanismus gibt, fordert Thread A sie trotzdem an . , Thread A muss nicht warten.


package com.jalja.org.thread.demo01;

public class Thread02 {
 public synchronized void method1(){
  System.out.println("method1:"+Thread.currentThread().getName());
  try {
   Thread.sleep(3000);
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
 }
 public void method2(){
  System.out.println("method2:"+Thread.currentThread().getName());
 }
 public static void main(String[] args) {
  final Thread02 th=new Thread02();
  Thread thread1=new Thread(new Runnable() {
   public void run() {
    th.method1();
   }
  },"th1");
  
  Thread thread2=new Thread(new Runnable() {
   public void run() {
    th.method2();
   }
  },"th2");
  
  thread1.start();
  thread2.start();
 }
}

Beobachten Sie die Ausgabe: Methode1:th1 und Methode2:th2 werden gleichzeitig ausgegeben. Dies liegt daran, dass Methode2 keine Synchronisationssteuerung hat, Thread2 also Ausführen der method2()-Methode Es ist keine Ausführungsberechtigung (Objektsperre) erforderlich.

2. Unsauberes Lesen von Daten

Wir müssen bei der Gestaltung des Geschäfts die Integrität des Unternehmens berücksichtigen, sonst kommt es zu sexuellen Problemen .


package com.jalja.org.thread.demo01;

public class Thread03 {
 private String name="zs";
 private String passWorrd="123";
 public synchronized void setValue(String name,String passWord){
  this.name=name;
  try {
   Thread.sleep(2000);
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  this.passWorrd=passWord;
  System.out.println("set:name="+this.name +" passWorrd="+this.passWorrd);
 }
 public void getValue(){
  System.out.println("get:name="+this.name +" passWorrd="+this.passWorrd);
 }
 public static void main(String[] args) throws InterruptedException {
  final Thread03 th=new Thread03();
  Thread thread=new Thread(new Runnable() {
   public void run() {
    th.setValue("LS", "456");
   }
  });
  thread.start();
  Thread.sleep(100);
  th.getValue();
 }
}

Ergebnis: get:name=LS passWorrd=123 set:name=LS passWorrd=456 Nach Ergebnis Es ist ersichtlich, dass offensichtlich ein Problem mit den Get-Daten vorliegt. Dies liegt daran, dass beim Festlegen des Thread-Threads der Haupt-Thread die Get-Methode ausführt. Um diese Situation zu vermeiden, müssen wir sicherstellen, dass, wenn ein Thread die Daten desselben Objekts verarbeitet, andernfalls andere Threads gleichzeitig auch die Daten des Objekts verarbeiten. In diesem Fall können wir einfach das synchronisierte Schlüsselwort zur get-Methode hinzufügen.

Das obige ist der detaillierte Inhalt vonBeispielanalyse der Synchronisation und Asynchronität von Objekten in Java-Threads. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn