Javaのsynchronizedの使い方を現役エンジニアが解説【初心者向け】

初心者向けにJavaのsynchronizedの使い方について解説しています。1つのインスタンスに対して、同時実行を行わないようにすることを排他制御といいます。synchronizedを使った排他制御の方法を学習しましょう。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が2,000以上あります。

Javaのsynchronizedの使い方について、TechAcademyのメンター(現役エンジニア)が実際のコードを使用して初心者向けに解説します。

 

Javaについてそもそもよく分からないという方は、Javaとは何なのか解説した記事を読むとさらに理解が深まるでしょう。

 

なお本記事は、TechAcademyのオンラインブートキャンプJava講座の内容をもとに作成しています。

 

田島悠介

今回は、Javaに関する内容だね!

大石ゆかり

どういう内容でしょうか?

田島悠介

synchronizedの使い方について詳しく説明していくね!

大石ゆかり

お願いします!

 

排他制御とは

排他制御とは、複数のユーザー(複数のスレッド)が同時に更新処理を行った場合、1人のユーザー(1つのスレッド)だけに処理を行わせたりする際の処理のことをさします。

複数のユーザーが同時に使用するアプリケーションを作成する場合、同時にデータが更新された場合などの制御を考えましょう。

 

synchronizedとは

synchronizedはブロック(メソッドまたはオブジェクト)にロックをかける処理であり、Javaのプログラムで排他制御を行う際に使用します。

ロックをかけることにより、synchronizedとして指定したブロックの中で処理をしている場合、他のスレッドがそのブロックに進入することができません。

 

[PR] Javaで挫折しない学習方法を動画で公開中

synchronizedの使い方

スレッドを動かす際のrun()メソッドにsynchronizedを使用する場合、下記の記述になります。

public synchronized void run()

 

実際に書いてみよう

以下、サンプルコードです。

class Synchro implements Runnable{
	private int num1 = 0;
	public synchronized void run() {
		try {
			num1++;
			if (num1 == 1) {
				System.out.println("1");
				wait();
				System.out.println("3");
				notify();
			} else if (num1 == 2) {
				System.out.println("2");
				notify();
				wait();
				System.out.println("4");
			}
		} catch(InterruptedException e) {
			System.out.println(e);
		}
	}
}

public class Jikko {
	public static void main(String[] args) {
		Synchro sh = new Synchro();
		Thread t1 = new Thread(sh);
		Thread t2 = new Thread(sh);
		t1.start();
		t2.start();
	}
}

実行結果

1
2
3
4

 

このサンプルプログラムは以下のような順番で処理を実行しています。
・Thread-1をwait()メソッドで停止させて
・Thread-2が変数numに10を代入してからnotify()メソッドを呼び出し、waitしていたThread-1を動かす
・Thread-1が動き出してnumの値を表示する

まとめ

synchronizedを使用し、複数のスレッドをしっかりと制御できるようにしておきましょう。

 

執筆してくれたメンター

松井紀明

メーカー系で17年エンジニアとして勤務後、現在はフリーのエンジニアとしてリモートワークで働いています。

Java、Perl、COBOL、最近ではRuby、PHP等、様々な言語での開発を経験しています。TechAcademyではJavaコースを担当しています。

 

大石ゆかり

Javaのsynchronizedの使い方がよく分かったので良かったです!

田島悠介

ゆかりちゃん、これからも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

TechAcademyでは、初心者でも最短4週間で、JavaやServletの技術を使ってWebアプリケーション開発を習得できるオンラインブートキャンプを開催しています。

 

また、現役エンジニアから学べる無料体験も実施しているので、参加してみてください。