我们可以用关键字private来保证数据对象只能被本类方法访问,所以我们只需对方法提出一套机制,来对共享的数据对象进行互斥锁定,这套机制就是线程的互斥使用关键字synchronized,有synchronized方法和synchronized块两种方法。
举例:模拟对银行账户的存取款操作
package Winter;
class Account3{//银行账户类
String name;
float amount;
public Account3(String name,float amount)
{
this.name=name;
this.amount=amount;
}
public void deposit(float amt){this.amount+=amt;}//存款方法
public float withdraw(float amt)//取款方法
{
if(this.amount<amt){
amt=amount;
amount=0;
}
return amt;
}
public float checkamount(){return this.amount;}//查询账户
}
class Save extends Thread{//存款线程
private Account3 a;
private float amount;
public Save(Account3 a,float amt)
{
this.a=a;
this.amount=amt;
}
public void run()
{
synchronized(a){
float k=a.checkamount();
try{
this.sleep(10);
}catch(InterruptedException e)
{
System.out.println(e.getMessage());
}
a.deposit(this.amount);
System.out.println("现有"+k+",存入"+this.amount+",余额"+a.checkamount());
}
}
}
class Fetch extends Thread{//取款线程
private Account3 a;
private int amount;
public Fetch(Account3 a,int amount)
{
this.a=a;
this.amount=amount;
}
public void run()
{
synchronized(a)
{
float k=a.checkamount();
try{
this.sleep(10);
}catch(InterruptedException e)
{
System.out.println(e.getMessage());
}
System.out.println("现有"+k+",取走"+a.withdraw(this.amount)+",余额"+a.checkamount());
}
}
}
public class test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Account3 a1=new Account3("张三",100);
(new Save(a1,100)).start();
(new Save(a1,200)).start();
(new Fetch(a1,500)).start();
}
}