下面是一个示例程序,有三个角色,一个家庭中的父亲,母亲,和儿子,同时在ATM取款机上向同一个银行账号进行取钱和查询的操作
1 测试类Java代码
public class Main { public static void main(String[] args) { //银行 Bank bank = new Bank(); //老爸 Father father = new Father(bank,50); //老妈 Monther monther = new Monther(bank,100); //儿子 Sun sun = new Sun(bank); new Thread(father).start(); new Thread(monther).start(); new Thread(sun).start(); System.out.println("ok"); } } |
2 Father.java
package com.servlets.synchronizedDemo; import java.text.DateFormat; /** |
3Mother.java
package com.servlets.synchronizedDemo; import java.text.DateFormat; /** |
4 sun.java
package com.servlets.synchronizedDemo; import java.text.DateFormat; /** |
4 Bank.java
package com.servlets.synchronizedDemo; /** * @author happymen itlife365.com * @version 創建時間:Aug 17, 2010 2:19:59 PM * 類說明:Bank.java */ public class Bank { private int money = 100; // 取钱 public synchronized void takeMoney(int num) throws InterruptedException{ System.out.println("取钱begin ,需要30秒 ....."); Thread.sleep(1000*30);//设置取钱需要30 秒 money = money - num; System.out.println("取钱 end ....."); } // 存钱 public synchronized void addMoney(int num){ try { System.out.println(" 存钱begin 需要60秒 ....."); Thread.sleep(1000*60); //设置存钱需要60秒 money += money; System.out.println(" 存钱end ....."); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //查询 public int queryMoney(){ System.out.println("查询很快 ....."); return money; } } |
我们只关注流程,其他的不关注~ ~ 运行结果:
ok
老爸正在取钱... --上午 9:33:53
取钱begin ,需要30秒 .....
查询很快 .....
儿子查询余额:100 --上午 9:33:53
老妈正在存钱.... 上午 9:33:53
取钱 end .....
老爸取走了50 --上午 9:34:23
存钱begin 需要60秒 .....
存钱end .....
老妈取走了100 --上午 9:35:23
结论:
老妈的存钱需要等老爸的取钱的同步完成,才调用存钱的同步,查询随时都可以
s
ynchronized method(){}可以防止多个线程同时访问这个对象的synchronized方法,如果一个对象有多个synchronized方法,只要一个线 程访问了其中的一个synchronized方法,那么其它线程不能同时访问这个对象中的任何一个synchronized方法,但可以访问这个对象中的非synchronized方法。