同步方法概述:与同步代码块对应,java的多线程还提供了同步方法,同步方法就是使用 synchronized关键字来修饰某个方法。
同步方法的代码格式如下:
访问修饰符 synchronized 返回类型 方法名(方法参数){ //同步方法体 }
银行取钱程序为例,代码如下:
一、创建一个账户类
package max.ji;
public class yinghang {
private String no; //卡号
private double blance;//卡里余额
public String getNo() {
return no;
}
public yinghang(String no, double blance) {
super();
this.no = no;
this.blance = blance;
}
//同步方法
public synchronized void darw(double dra) {
//吐钱
if (this.getBlance()>dra) {
System.out.println(Thread.currentThread().getName()+"取钱成功:"+dra+"元");
this.blance-=dra;
System.out.println("账户:"+this.getNo()+"还剩:"+this.blance+"元");
}else {
System.out.println(Thread.currentThread().getName()+"取钱失败,卡内余额不足");
}
}
public void setNo(String no) {
this.no = no;
}
public double getBlance() {
return blance;
}
public void setBlance(double blance) {
this.blance = blance;
}
}
二、创建同步方法类
package max.ji;
public class T1 extends Thread{
private yinghang acYinghang;
private double dra;
public T1(String name,yinghang acYinghang, double dra) {
super(name);
this.acYinghang = acYinghang;
this.dra = dra;
}
public void run() {
//直接调用yinghang对象的darw()方法来取钱
//同步方法的同步监听器是this,this代表调用draw()方法的对象
//也就是说,线程加入draw方法之前,必须对account的对象加锁
acYinghang.darw(dra);
}
//线程同步问题
public static void main(String[] args) {
yinghang account=new yinghang("201903300076", 1200); //赋值卡号和卡里的金额
//两个线程在一个账户取钱
new T1("张三", account, 600).start();//启动线程
new T1("李四", account, 650).start();//启动线程
}
}
运行效果如下: