方法1(对象锁)
同步代码块
灵活
synchronized (){
//同步代码块;
}
//取款的方法
public synchronized void withdraw(double money) {
//这几行代码线程排队,不能并发
//取款之前的余额
/**
*缺点:效率低,只能是this,不能是其他对象。不灵活
优点:代码少,节俭
*/
//这里共享对象是Account------>this
double before = this.getBalance();
//取款后的余额
double after = before - money;
//模拟网络延迟
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//更新账户
//思考:t1执行到这,但是还没来的急执行这行代码,t2线程进来withdraw方法。
this.setBalance(after);
}
}
方法2(类锁)
在实例方法上用synchronized,表示共享对象一定是this
并且同步代码块是整个方法体
//取款的方法
public synchronized void withdraw(double money) {
//t1和t2并发这个方法。t1和t2是2个栈,2个栈操作堆中的同一个对象
//取款之前的余额
double before = this.getBalance();
//取款后的余额
double after = before - money;
//模拟网络延迟
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//更新账户
//思考:t1执行到这,但是还没来的急执行这行代码,t2线程进来withdraw方法。
this.setBalance(after);
}
方法3
在静态方法上使用synchronized
表示找类锁
类锁永远只有1把
就算创建了100个对象,那类锁也只有一把
对象锁:1个对象一把锁,100个对象100把锁
类锁:100个对象,也可能只是一把类锁