现象:Thread的ReentrantLock类使用失效,同步锁未能成功
题目背景:银行有一个账户,有两个储户分别向同一个账户存3000元,每次存1000,存3次。每次存完打印账户余额。
package com.exer;
import java.util.concurrent.locks.ReentrantLock;
class Account2{
private double balance;
public Account2(double balance){
this.balance = balance;
}
//存钱
public void deposit(double amt){
if(amt > 0){
balance += amt;
try {
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+":存钱成功,余额为:"+ balance);
}
}
}
class Customer2 extends Thread{
private Account2 acct;
public Customer2(Account2 acct){
this.acct = acct;
}
private ReentrantLock lock = new ReentrantLock();
@Override
public void run() {
for(int i=0;i<3;i++){
lock.lock();
try{
acct.deposit(1000);
}finally {
lock.unlock();
}
}
}
}
public class AcountTest2 {
public static void main(String[] args) {
Account2 acct = new Account2(0);
Customer2 c1 = new Customer2(acct);
Customer2 c2 = new Customer2(acct);
c1.setName("甲");
c2.setName("乙");
c1.start();
c2.start();
}
}
乙:存钱成功,余额为:2000.0
甲:存钱成功,余额为:2000.0
甲:存钱成功,余额为:4000.0
乙:存钱成功,余额为:5000.0
乙:存钱成功,余额为:6000.0
甲:存钱成功,余额为:6000.0
在run方法里,按照ReentrantLock类的使用说明,进行定义,lock()上锁,unlock()关锁。
乙:存钱成功,余额为:1000.0
甲:存钱成功,余额为:2000.0
甲:存钱成功,余额为:3000.0
乙:存钱成功,余额为:4000.0
乙:存钱成功,余额为:5000.0
甲:存钱成功,余额为:6000.0
两个锁又互不影响;
锁放外面,共用一个锁
private Account2 acct;
private ReentrantLock lock;
public Customer2(Account2 acct, ReentrantLock lock) {
this.acct = acct;
this.lock = lock;
}