ホームページ  >  記事  >  Java  >  Java スレッドにおけるオブジェクトの同期と非同期の分析例

Java スレッドにおけるオブジェクトの同期と非同期の分析例

黄舟
黄舟オリジナル
2017-07-20 14:16:022017ブラウズ

以下のエディターは、Java スレッド オブジェクトの同期と非同期に関する記事を提供します (例による説明)。編集者はこれがとても良いものだと思ったので、皆さんの参考として今から共有します。エディターをフォローして一緒に見てみましょう

1. マルチスレッド環境での同期と非同期

同期:A スレッドがリソースを要求しようとしていますが、このリソースは B によって使用されています。同期メカニズムが存在し、スレッド A がそれを要求できないため、スレッド A は待機するしかありません。


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

出力を観察します。method1:th1 は 3 秒後に method2:th2 を出力します。これは、method2() とmethod1() が両方とも同期メソッドであり、スレッド thread1 と thread2 が同じオブジェクト th で動作するためです。 thread2 が method2() メソッドを実行するときは、最初に th オブジェクトのロックを取得する必要があります。

非同期: スレッド A はリソースを要求しようとしていますが、このリソースはスレッド B によって使用されています。同期メカニズムがないため、スレッド A は引き続きそれを要求でき、スレッド A は待つ必要がありません。


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

出力を観察してください。method1:th1 とmethod2:th2 が同時に出力されます。これは、method2 が同期制御を追加していないため、スレッド thread2 は実行時に実行許可 (オブジェクトのロック) を取得する必要がありません。 Method2() メソッド。

2. データのダーティリード

ビジネスを設計する際には、ビジネスの整合性を考慮する必要があります。そうしないと、データの一貫性の問題が発生します。


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

Result: get:name=LS passWorrd=123 set:name=LS passWorrd=456 この結果から、明らかにgetデータに問題があることがわかります。スレッド thread が設定されている、メインスレッド get メソッドを実行します。この状況を回避するには、スレッドが同じオブジェクトのデータを操作しているときに、他のスレッドも同時にオブジェクトのデータを操作するようにする必要があります。この場合、get メソッドに synchronized キーワードを追加できます。

以上がJava スレッドにおけるオブジェクトの同期と非同期の分析例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。