クラスに Java Synchronized Block を使用する

Zeeshan Afridi 2023年10月12日
  1. クラスに Java Synchronized Block を使用する
  2. まとめ
クラスに Java Synchronized Block を使用する

Java では、同期とは、共有可能なリソースにアクセスする複数のスレッドを管理することです。 Java での同期は、スレッドが相互に確実に通信できるようにするために使用され、単一のスレッドが共有リソースにアクセスするための最良のオプションとも考えられています。

synchronized キーワードは、同期ブロックをマークするために使用されます。 一部のオブジェクトでは、Java 同期ブロックが適用されます。

クラスに Java Synchronized Block を使用する

同じオブジェクトの同期ブロックに複数のスレッドがある場合、1つのスレッドのみがブロックに入り、一度に 1つのスレッドしか実行できません。 他のすべてのスレッドはブロックされたままになります。

クラスの Java 同期ブロックについて、例を挙げて説明しましょう。

コード例:

class Block {
  // synchronized block starts from here
  void printBlock(int b) {
    synchronized (this) {
      System.out.println("The block output is: ");
      for (int j = 1; j <= 4; j++) {
        System.out.println(b * j);

        // handles exception
        try {
          Thread.sleep(500);
        } catch (Exception e) {
          System.out.println(e);
        }
      }
    }
  } // ending
}

class S1 extends Thread {
  Block s;
  S1(Block s) {
    this.s = s;
  }

  public void run() {
    s.printBlock(10);
  }
}

class S2 extends Thread {
  Block s;
  S2(Block s) {
    this.s = s;
  }

  public void run() {
    s.printBlock(200);
  }
}

class SyncBlock {
  // main method
  public static void main(String args[]) {
    // object creation
    Block obj = new Block();
    S1 s1 = new S1(obj);
    S2 s2 = new S2(obj);

    // run the threads s1 and s2
    s1.run();
    s2.run();
  }
}

出力:

The block output is:
10
20
30
40
The block output is:
200
400
600
800

上記の例では、S1S2 の 2つのスレッドがあります。 両方のスレッドには、同期 メソッドを呼び出すのに役立つ printBlock メソッドがあります。

S1 スレッドの入力値は 10 で、S2 の場合は 200 です。次に、ブロック出力は S1S2 スレッド出力の間に出力されます。

コード例:

import java.util.*;

class synchronize {
  String title = "";
  public int c = 0;
  public void result(String s, List<String> li) {
    // only one thread is allowed to change the title simultaneously.
    synchronized (this) {
      title = s;
      c++;
    }

    li.add(s);
  }
}

class SyncBlock {
  // main method
  public static void main(String[] args) {
    // for synchronize class, we have created an object
    synchronize ob = new synchronize();

    // we have created a list here
    List<String> li = new ArrayList<String>();

    // for calling the method, a string is passed to it
    ob.result("Sprint Planning", li);
    System.out.println(ob.title);
  }
}

出力:

Sprint Planning

上記の例では、クラスの同期が作成されています。 このクラスでは、synchronized メソッドを使用しました。

メソッドを呼び出すための入力値として文字列が渡されます。 つまり、スプリント計画です。

上記のプログラムを実行すると、出力として Sprint Planning が得られます。

まとめ

Java で同期ブロックについて説明する方法はたくさんありますが、この記事では、同期、同期ブロック、およびそのしくみについて説明しました。

オブジェクトに対して一度に複数の スレッド がある場合、同期ブロックを使用すると、一度に 1つのスレッドしか実行できません。 ブロック内のスレッドが正常に実行されるまで、他のスレッドはブロックに入ることができません。

したがって、Java の同期ブロック クラスにより、たとえば、一度にブロック内に存在する スレッド は 1つだけになります。

著者: Zeeshan Afridi
Zeeshan Afridi avatar Zeeshan Afridi avatar

Zeeshan is a detail oriented software engineer that helps companies and individuals make their lives and easier with software solutions.

LinkedIn