#07:排他制御(synchronized)
このチャプターでは、マルチスレッド環境における排他制御について学習します。
javac -d classes/jp.paiza.thread -p classes source/jp.paiza.thread/module-info.java source/jp.paiza.thread/jp/paiza/thread/*.java
java -p classes --module jp.paiza.thread/jp.paiza.thread.A
ブラウザを開くだけでエディタ、Webサーバ、DB等の開発環境が整うクラウド開発環境PaizaCloudクラウドIDE。
PaizaCloud
https://paiza.cloud/ja/
シェルコマンド入門編
https://paiza.jp/works/shellcommand/primer
Linux入門編
https://paiza.jp/works/linux/primer
新・Linux入門編(LinuC対策版)
https://paiza.jp/works/linux/new-primer
モジュール・システムについて学習しよう
https://paiza.jp/works/java/new-primer/java-new-primer-34
ストリームAPIについて学習しよう > 関数型インターフェース(Functional Interface)
https://paiza.jp/works/java/new-primer/java-new-primer-33/102000
ストリームAPIについて学習しよう > ラムダ式
https://paiza.jp/works/java/new-primer/java-new-primer-33/102002
package jp.paiza.thread;
import java.util.stream.*;
public class A {
/** 銀行 */
static class Bank {
/** 残高 */
private int balance = 10000;
private Object o1 = new Object();
/** 入金 */
void deposit(int amount) {
synchronized (o1) {
balance += amount;
}
}
/** 出金 */
void withdraw(int amount) {
synchronized (o1) {
balance -= amount;
}
}
/** 残高照会 */
int getBalance() {
return balance;
}
}
public static void main(String... args) {
final var bank = new Bank();
var t1 = new Thread(() -> IntStream.range(0, 100000).forEach(i -> bank.deposit(10)));
var t2 = new Thread(() -> IntStream.range(0, 100000).forEach(i -> bank.withdraw(10)));
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(bank.getBalance());
}
}