在JAVA中,线程的同步主要是由synchronized实现。
这里给出一个银行存取款的实例:
为了避免出现存取的同时操作使得存款小于0,这里采用了synchronized实现同步。
public class Bank implements Runnable {
public Bank(String s1,String s2){
this.s1=s1;
this.s2=s2;
}
public void run(){
saveBankMoney(11000);
getBankMoney(5000);
}
public synchronized void saveBankMoney(double save_money){
if(Thread.currentThread().getName().equals(s1)){
for(int i=1;i<3;i++){
if(save_money==11000){
this.money+=save_money;
try{
Thread.sleep(2000);
}catch(InterruptedException ex){
ex.printStackTrace();
}
System.out.println("我要存款:"+save_money);
System.out.println("存款成功!账号目前余额为:"+this.money);
}
}
}
}
public synchronized void getBankMoney(double get_money){
if(Thread.currentThread().getName().equals(s2)){
for(int i=1;i<3;i++){
if(money>=get_money){
this.money=this.money-get_money;
try{
Thread.sleep(2000);
}catch(InterruptedException ex){
ex.printStackTrace();
}
System.out.println("我要取款:"+get_money);
System.out.println("取款成功!账号目前余额为:"+this.money);
}
else{
System.out.println("账号余额不足!");
}
}
}
}
private double money=10000.0;
private String s1;
private String s2;
}
运行下面的代码:
public class TestBank {
public static void main(String[] args){
String s1="saveBankMoney";
String s2="getBankMoney";
Bank bank=new Bank(s1, s2);
Thread save_Money=new Thread(bank);
Thread get_Money=new Thread(bank);
save_Money.setName(s1);
get_Money.setName(s2);
save_Money.start();
get_Money.start();
}
}
可以得到输出结果: