为什么使用Lock没有解决线程安全问题

/**

* 银行有一个账户。

* 有两个储户分别向同一个账户存3000元,每次存1000,存3次。每次存完打印账户余额。

*

*/

public class AccountTest {

public static void main(String[] args) {

//账户(锁)只有一个

Account account = new Account(0);

//拥有同一个账户的两个客户(线程)

Customer c1 = new Customer(account);

Customer c2 = new Customer(account);

Thread t1 = new Thread(c1);

Thread t2 = new Thread(c2);

t1.setName("丈夫");

t2.setName("妻子");

t1.start();

t2.start();

}

}

class Account{

private double balance;

public Account() {

}

public Account(double balance) {

this.balance = balance;

}

//功能:存钱

// public synchronized void deposit(double money)

public void deposit(double money){

//为什么这里使用Lock锁效果不一样???

ReentrantLock rl = new ReentrantLock();

rl.lock();

try {

if (money>0){

balance+=money;

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName()+"存钱成功,余额为"+balance);

}

} finally {

rl.unlock();

}

}

}

class Customer implements Runnable{

private Account acc;

public Customer() {

}

public Customer(Account acc) {

this.acc = acc;

}

@Override

public void run() {

//往里面存3次1000块

for (int i = 0; i < 3; i++) {

acc.deposit(1000);

}

}

}


回答:

每次调用都重新 new 一个 Lock 出来,于是都是不同的 lock ,达不到互斥的效果。

以上是 为什么使用Lock没有解决线程安全问题 的全部内容, 来源链接: utcz.com/p/944307.html

回到顶部