/**
* 线程的互斥,主要展示同步方法与非同步方法的区别
*/
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 {
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 {
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 {
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 {
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;
//访问帐号的方法
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();
e.printStackTrace();
}
//下面测试同步方法
account = new Account();
System.
out.
println("使用同步方法时:");
threadA = new AccessThread(account, "synDeposit");
threadB = new AccessThread(account, "synWithdraw");
threadA.start();
threadB.start();
}
}