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();
}
}
-- 学海无涯