Aが預金額を取得(10万円) Bが預金額を取得(10万円) Aが1万円預ける(10万円 + 1万円で11万円) Bが2万円引き出す(10万円 - 2万円 = 8万円)どういうことか分かったでしょうか。
| BankCommon.java |
|---|
package first.java.unit13.model;
// 銀行に関するインタフェース
public interface BankCommon {
// お金を預金額に追加する
public void add(long money);
// お金を預金額を引き出す
public long get(long money);
}
|
| Bank.java |
|---|
package first.java.unit13.model;
// 銀行
public class Bank implements BankCommon {
// 預金額
private long saving;
// 最初の預金金額
public Bank() {
saving = 100000;
System.out.println("最初の預金額は" + saving + "円あります");
}
// お金を預金額に追加する
public void add(long money) {
long now = saving + money;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
saving = now;
String name = Thread.currentThread().getName();
System.out.println(name + ":預金額 = " + saving);
}
// お金を預金額を引き出す
public long get(long money) {
long now = saving - money;
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
saving = now;
String name = Thread.currentThread().getName();
System.out.println(name + ":預金額 = " + saving);
return saving;
}
}
|
| AUser.java |
|---|
package first.java.unit13.model;
// Aユーザ
public class AUser implements Runnable {
// 使用する銀行
private BankCommon bank;
// 使用する銀行を設定
public AUser(BankCommon bank) {
this.bank = bank;
}
// スレッドはここからスタート
public void run() {
bank.add(10000);
}
}
|
| BUser.java |
|---|
package first.java.unit13.model;
// Bユーザ
public class BUser implements Runnable {
// 使用する銀行
private BankCommon bank;
// 使用する銀行を設定
public BUser(BankCommon bank) {
this.bank = bank;
}
// スレッドはここからスタート
public void run() {
bank.get(20000);
}
}
|
| Sample13_4_1.java |
|---|
package first.java.unit13.sample;
import first.java.unit13.model.AUser;
import first.java.unit13.model.BUser;
import first.java.unit13.model.Bank;
// 単位13 4時間目 サンプル1
public class Sample13_4_1 {
// ここからスタート
public static void main(String[] args) {
Bank bank = new Bank();
Runnable aUser = new AUser(bank);
Runnable bUser = new BUser(bank);
Thread addThread = new Thread(aUser, "Aユーザ");
Thread getThread = new Thread(bUser, "Bユーザ");
addThread.start();
getThread.start();
}
}
|
最初の預金額は100000円あります
Aユーザ:預金額 = 110000
Bユーザ:預金額 = 80000
|
アクセス修飾子 synchronized 戻り型 メソッド名(引数) {
:
:
}
の通りです。
synchronized(オブジェクト) {
:
:
}
とメソッド内に書けば「synchronized」ブロックの範囲だけロックされます。| BankControl.java |
|---|
package first.java.unit13.model;
// 銀行排他制御と同期制御済み
public class BankControl implements BankCommon {
// 預金額
private long saving;
// 最初の預金金額
public BankControl() {
saving = 100000;
System.out.println("最初の預金額は" + saving + "円あります");
}
// お金を預金額に追加する
public synchronized void add(long money) {
long now = saving + money;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
saving = now;
String name = Thread.currentThread().getName();
System.out.println(name + ":預金額 = " + saving);
}
// お金を預金額を引き出す
public synchronized long get(long money) {
long now = saving - money;
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
saving = now;
String name = Thread.currentThread().getName();
System.out.println(name + ":預金額 = " + saving);
return saving;
}
}
|
| Sample13_4_2.java |
|---|
package first.java.unit13.sample;
import first.java.unit13.model.AUser;
import first.java.unit13.model.BUser;
import first.java.unit13.model.BankControl;
// 単位13 4時間目 サンプル1
public class Sample13_4_2 {
// ここからスタート
public static void main(String[] args) {
BankControl bank = new BankControl();
Runnable aUser = new AUser(bank);
Runnable bUser = new BUser(bank);
Thread addThread = new Thread(aUser, "Aユーザ");
Thread getThread = new Thread(bUser, "Bユーザ");
addThread.start();
getThread.start();
}
}
|
最初の預金額は100000円あります Aユーザ:預金額 = 110000 Bユーザ:預金額 = 90000 |