synchronized方法验证

下面是一个示例程序,有三个角色,一个家庭中的父亲,母亲,和儿子,同时在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;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author happymen
 * @version 創建時間:Aug 17, 2010 2:28:16 PM
 * 類說明:Father.java
 */
public class Father extends Thread {
 private Bank bank;
 private int num;
 
 DateFormat dateFormate = new SimpleDateFormat("a h:mm:ss");  //日期格式对象   
 public Father(Bank bank,int num){
  this.bank = bank;
  this.num = num;
 }
 
  public void run() {   
         System.out.println("老爸正在取钱...       --"+dateFormate.format(new Date()));   
         try {
   bank.takeMoney(num);
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }   
         System.out.println("老爸取走了"+num +"          --"+dateFormate.format(new Date()));   
     }   
}
 

3Mother.java

package com.servlets.synchronizedDemo;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author happymen itlife365.com
 * @version 創建時間:Aug 17, 2010 5:37:08 PM
 * 類說明:Mother.java
 */
public class Monther extends Thread{   
    private Bank bank;   
    private int num;   
     DateFormat dateFormate = new SimpleDateFormat("a h:mm:ss");  //日期格式对象   
       
    public Monther(Bank bank,int num) {   
        this.bank = bank;   
        this.num = num;   
     }   
  
    public void run() {   
         System.out.println("老妈正在存钱....          "+dateFormate.format(new Date()));   
   bank.addMoney(num);
         System.out.println("老妈取走了"+num+"          --"+dateFormate.format(new Date()));   
     }   
}  
 

 

4 sun.java

package com.servlets.synchronizedDemo;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author happymen itlife365.com 
 * @version 創建時間:Aug 17, 2010 5:38:20 PM
 * 類說明:Sun.java
 */
public class Sun extends Thread{   
    private Bank bank;   
    DateFormat dateFormate = new SimpleDateFormat("a h:mm:ss");  //日期格式对象   
    public Sun(Bank bank) {   
        this.bank = bank;   
     }   
  
    public void run() {   
        //查询余款   
         System.out.println("儿子查询余额:"+bank.queryMoney() +"      --"+dateFormate.format(new Date()));   
     }   
}

 

 

 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方法。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2025年1月    »
12345
6789101112
13141516171819
20212223242526
2728293031
搜索
标签列表
网站分类
最新留言
    文章归档
    友情链接

    Powered By Z-BlogPHP 1.7.3

    Copyright Your WebSite.Some Rights Reserved.闽ICP备11018667号-2