next up previous
Next: 17.3 スレッドの例 3 Up: 17 デーモンスレッド Previous: 17.1 スレッドの例 1

17.2 スレッドの例 2

預金の残高を2つのスレッドで加算してゆく例.
/*
 * ap/basic/Ban.java
 */
package basic;

class Bank {
  private long balance0 = 0;
  private long balance1 = 0;
  private long balance2 = 0;

  public void inc0() {
    balance0++;  // balance0 = balance0 + 1;
  }
  public synchronized void synInc1() {
    balance1++;
  }
  public void inc2() {
    balance2++;
  }

  public static void main (String[] args) {
    Bank bank = new Bank();
    Thread add1 = new Thread(new Add(bank));
    Thread add2 = new Thread(new Add(bank));
    add1.start();
    add2.start();
    try {
      add1.join();
      add2.join();
    } catch (InterruptedException e) {}
    System.out.println("balance0 = " + bank.balance0);
    System.out.println("balance1 = " + bank.balance1);
    System.out.println("balance2 = " + bank.balance2);
  }
}
/*
 * ap/basic/Add.java
 */
package basic;

class Add implements Runnable {
  private Bank bank;
  private final long loop = 50000000L;

  Add(Bank bank) {
    this.bank = bank;
  }

  public void run() {
    for (long i = 0; i < loop; i++) {
      bank.inc0();
    }
    for (long i = 0; i < loop; i++) {
      bank.synInc1();
    }
    for (long i = 0; i < loop; i++) {
      synchronized (bank) {
        bank.inc2();
      }
    }
  }
}
% javac basic/Bank.java
% java basic.Bank
balance0 = 91717419
balance1 = 100000000
balance2 = 100000000


generated through LaTeX2HTML. M.Inaba 平成18年5月7日