package com.chang.exer;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 题目:两个储户分别向同一个帐户存3000元,每次存1000,存三次。每次存完打印账户余额。
*
* @author Cao Longchang
* @create 2022-04-28 20:15
*/
// 测试类
public class AccountTest {
public static void main(String[] args) {
Customer c1 = new Customer("甲", 3000);
Customer c2 = new Customer("乙", 5000);
Thread t1 = new Thread(c1);
Thread t2 = new Thread(c2);
t1.start();
t2.start();
}
}
// 账户类
class Account {
private static float balance = 0F;
public static float getBalance() {
return balance;
}
public static void setBalance(float balance) {
Account.balance = balance;
}
}
//储户类
class Customer implements Runnable {
private String name;
private float balance;
public Customer(String name, float balance) {
this.name = name;
this.balance = balance;
}
@Override
public void run() {
for (int i = 0; i < 3; i++) {
deposit(1000);
//强制阻塞,增大线程交替执行的概率
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// 创建Lock对象
static Lock lock = new ReentrantLock();
// 创建存钱方法,并使用Lock锁方式保证线程安全
void deposit(float money) {
try {
lock.lock();
if (money <= balance) {
float b1 = Account.getBalance() + money;
balance -= money;
//强制阻塞,增大不安全概率
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
Account.setBalance(b1);
System.out.println(this.name + "存钱成功,余额为:" + b1);
} else {
System.out.println(this.name + "对不起,余额不足,请充值!");
}
} finally {
lock.unlock();
}
}
}
多线程——java练习题
最新推荐文章于 2023-07-28 20:44:24 发布