/** |
* 线程的互斥,主要展示同步方法与非同步方法的区别 |
*/ |
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(); |
} |
} |