/* * 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