演習課題「アトミック変数を使ってみよう」
現在、右側の演習環境には銀行口座への入出金をおこなうプログラムがあります。しかし、このコードを何度か実行すると、想定しない値が出力されることがあります。ここで、アトミック変数を用いて、銀行口座への入出金が正しく実行されるようにしてください。
なお、コンパイルコマンドについて理解できれいれば、以下のコマンドをコピーして利用してください。
javac -d classes/jp.paiza.thread -p classes source/jp.paiza.thread/module-info.java source/jp.paiza.thread/jp/paiza/thread/TEST.java
また、実行コマンドについて理解できていれば、以下の実行コマンドをコピーして利用してください。
java -p classes --module jp.paiza.thread/jp.paiza.thread.TEST
期待する出力値
612345
#05:アトミック変数(Atomic Variables)
このチャプターでは、アトミック変数について学習します。
ブラウザを開くだけでエディタ、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
新・Java入門編34: モジュール・システムについて学習しよう
https://paiza.jp/works/java/new-primer/java-new-primer-34
パッケージjava.util.concurrent.atomic
https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/concurrent/atomic/package-summary.html
コンパイルコマンド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
A.javapackage jp.paiza.thread;
import java.util.stream.*;
import java.util.concurrent.atomic.*;
public class A {
/** 銀行 */
static class Bank {
/** 残高 */
private AtomicInteger balance = new AtomicInteger(10000);
/** 入金 */
void deposit(int amount) {
balance.addAndGet(amount);
}
/** 出金 */
void withdraw(int amount) {
balance.addAndGet(-amount);
}
/** 残高照会 */
int getBalance() {
return balance.get();
}
}
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());
}
}