Cyh的博客

Email:kissyan4916@163.com
posts - 26, comments - 19, trackbacks - 0, articles - 220

线程3--线程的互斥

Posted on 2009-06-02 20:14 啥都写点 阅读(175) 评论(0)  编辑  收藏 所属分类: J2SE
关键技术:
  • 在类的方法声明中使用synchronized关键字可以保证在同一时刻只有一个线程能够进入该方法。
  • synchronized可以出现在代码块中,表示同一时刻只有一个线程能够进入该段代码。

package book.thread;

/**
 * 线程的互斥,主要展示同步方法与非同步方法的区别
 
*/
public class Synchronized {
    
/**
     * 帐号类
     
*/
    
static class Account{
        
//共享资源, 钱数
        private double money = 1000.0d;
        
/**
         * 存钱    没有同步机制
         * 
@param fFees
         
*/
        
public void nonSynDeposit(double fFees){
            System.out.println(
"Account nonSynDeposit begin! money = " + this.money + "; fFees = " + fFees);
            
//存钱钱先等待300毫秒
            System.out.println("Account nonSynDeposit sleep begin!");
            
try {
                Thread.sleep(
300);
            } 
catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(
"Account nonSynDeposit sleep end!");
            
this.money = this.money + fFees;
            System.out.println(
"Account nonSynDeposit end! money = " + this.money);
        }
        
/**
         * 取钱    没有同步机制
         * 
@param fFees
         
*/
        
public void nonSynWithdraw(double fFees){
            System.out.println(
"Account nonSynWithdraw begin! money = " + this.money + "; fFees = " + fFees);
            
//取钱时先等待400毫秒
            System.out.println("Account nonSynWithdraw sleep begin!");
            
try {
                Thread.sleep(
400);
            } 
catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(
"Account nonSynWithdraw sleep begin!");
            
this.money = this.money - fFees;
            System.out.println(
"Account nonSynWithdraw end! money = " + this.money);
        }
        
/**
         * 存钱    有同步机制
         * 
@param fFees
         
*/
        
public synchronized void synDeposit(double fFees){
            System.out.println(
"Account synDeposit begin! money = " + this.money + "; fFees = " + fFees);
            
//存钱钱先等待300毫秒
            System.out.println("Account synDeposit sleep begin!");
            
try {
                Thread.sleep(
300);
            } 
catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(
"Account synDeposit sleep begin!");
            
this.money = this.money + fFees;
            System.out.println(
"Account synDeposit end! money = " + this.money);
        }
        
/**
         * 取钱    有同步机制
         * 
@param fFees
         
*/
        
public synchronized void synWithdraw(double fFees){
            System.out.println(
"Account synWithdraw begin! money = " + this.money + "; fFees = " + fFees);
            
//取钱时先等待400毫秒
            System.out.println("Account synWithdraw sleep begin!");
            
try {
                Thread.sleep(
400);
            } 
catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(
"Account synWithdraw sleep end!");
            
this.money = this.money - fFees;
            System.out.println(
"Account synWithdraw end! money = " + this.money);
        }
    }
    
    
static class AccessThread extends Thread{
        
//待访问的帐号对象
        private Account account = null;
        
//访问帐号的方法
        private String method = "";

        
public AccessThread(Account account, String method){
            
this.method = method;
            
this.account = account;
        }
        
public void run(){
            
//对不同的方法名参数调用不同的方法
            if (method.equals("nonSynDeposit")){
                account.nonSynDeposit(
500.0);
            } 
else if (method.equals("nonSynWithdraw")){
                account.nonSynWithdraw(
200.0);
            } 
else if (method.equals("synDeposit")){
                account.synDeposit(
500.0);
            } 
else if (method.equals("synWithdraw")){
                account.synWithdraw(
200.0);
            }
        }
    }

    
public static void main(String[] args) {
        
//待操作的帐号对象,所有操作都针对该帐号
        Account account = new Account();
        
        System.out.println(
"使用非同步方法时:");
        
//非同步方法存钱的线程
        Thread threadA = new AccessThread(account, "nonSynDeposit");
        
//非同步方法取钱的线程
        Thread threadB = new AccessThread(account, "nonSynWithdraw");
        threadA.start();
        threadB.start();
        
//等待两线程运行结束
        try {
            threadA.join();
            threadB.join();
        } 
catch (InterruptedException e) {
            e.printStackTrace();
        }
        
//下面测试同步方法
        System.out.println();
        account 
= new Account();
        System.out.println(
"使用同步方法时:");
        threadA 
= new AccessThread(account, "synDeposit");
        threadB 
= new AccessThread(account, "synWithdraw");
        threadA.start();
        threadB.start();
    }
}



                                                                                                       --    学海无涯