Maison  >  Article  >  Java  >  Exemple d'analyse de la synchronisation et de l'asynchronisme des objets dans les threads Java

Exemple d'analyse de la synchronisation et de l'asynchronisme des objets dans les threads Java

黄舟
黄舟original
2017-07-20 14:16:021976parcourir

L'éditeur suivant vous apportera un article sur la synchronisation et l'asynchronisme des objets thread Java (explication avec exemples). L'éditeur le trouve plutôt bon, je vais donc le partager avec vous maintenant et le donner comme référence pour tout le monde. Suivons l'éditeur et jetons un coup d'œil

1. Synchronisation et asynchronisme dans un environnement multithread

Synchronisation : Le thread A veut demander une ressource, mais cette ressource est utilisée par le thread B. En raison du mécanisme de synchronisation, le thread A ne peut pas la demander. Que dois-je faire ?


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();
 }
}

Observez le résultat : method1:th1 génère method2:th2 après 3 secondes. En effet, method2() et method1() sont toutes deux des méthodes synchrones et des Threads. thread1 et thread2 opèrent sur le même objet, donc lorsque thread2 exécute la méthode method2(), il doit d'abord obtenir le verrou du ème objet.

Asynchrone : Le thread A veut demander une ressource, mais cette ressource est utilisée par le thread B. Comme il n'y a pas de mécanisme de synchronisation, le thread A la demande quand même , le thread A n'a pas besoin d'attendre.


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();
 }
}

Observez la sortie : méthode1:th1 et méthode2:th2 sont sorties en même temps. C'est parce que méthode2 n'a pas de contrôle de synchronisation, donc le thread thread2 l'est. exécuter la méthode method2() Il n'est pas nécessaire d'obtenir l'autorisation d'exécution (verrouillage d'objet).

2. Lecture sale des données

Nous devons tenir compte de l'intégrité de l'entreprise lors de la conception de l'entreprise, sinon la cohérence des données se produira. .


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();
 }
}

Résultat : get:name=LS passWorrd=123 set:name=LS passWorrd=456 Par résultat On peut voir qu'il y a évidemment un problème avec les données get. En effet, lorsque le thread est défini, le thread principal exécute la méthode get. Pour éviter cette situation, nous devons nous assurer que lorsqu'un thread exploite les données du même objet, sinon d'autres threads exploiteront également les données de l'objet en même temps. Dans ce cas, nous pouvons ajouter le mot-clé synchronisé à la méthode get.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn