package d3_thread_safe;
public class Account {
private String cardId;
private double money;//账户余额
public Account() {
}
public Account(String cardId, double money) {
this.cardId = cardId;
this.money = money;
}
public void drawMoney(double money) {
//判断是谁来取钱
String name = Thread.currentThread().getName();
//判断余额是否足够
if (this.money >= money) {
//取钱
System.out.println(name + "来取钱成功,吐出:" + money);
//更新余额
this.money -= money;
System.out.println("剩余:" + this.money);
} else {
System.out.println("余额不足");
}
}
public String getCardId() {
return cardId;
}
public void setCardId(String cardId) {
this.cardId = cardId;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
}
package d3_thread_safe;
/*
取钱的线程类
*/
public class DrawThread extends Thread {
private Account acc;
public DrawThread(Account acc, String name) {
super(name);
this.acc = acc;
}
@Override
public void run() {
//小明 小红 取钱
acc.drawMoney(100000);
}
}
package d3_thread_safe;
/*
需求:模拟取钱案例
解决线程安全问题的办法就是加锁
*/
public class ThreadDemo {
public static void main(String[] args) throws Exception {
//1、定义一个线程类,创建一个共享账户对象
Account acc = new Account("ICBC-111", 100000);
//2、创建两个线程对象 代表小明和小红同时进来
new DrawThread(acc, "小明").start();
Thread.sleep(3000); //这里可以采取休眠来解决安全嘛?
new DrawThread(acc, "小红").start();
}
}
提出的问题在最后代码块注释中 Thread.sleep(3000)哪一行里
首先, 代码层面上用休眠是否解决了线程安全问题?
答: 在你这个demo里面, 没有线程安全问题; 作为学习, 是可以这样做试验的.
但是呢, 多说几句:
多线程或者并发编程的意义, 是为了提高CPU使用率以及系统的业务处理能力,说白了就是单位时间内多干活, 如果有个线程在"消极怠工", 例如, 它在读网络, 读磁盘...等, 这种操作相比cpu的速度很慢, 那么就把CPU时间贡献给最需要的线程.这样整体的执行效率会提高.
所以, 在这个层面上, 你的代码只能是demo, 违背了多线程并发的意义.
既然不能用休眠来解决线程安全问题, 那么如何处理呢?
答案是: 同步. 例如(常见的synchronized, 或者其它对锁的优化方案等)
希望我的回答能给你带来进一步思考, 有问题继续交流.
并不能只是延迟了下面线程的执行时间,要是上面的线程延迟超过3s才走进判断,下面下次还是会抢占资源
休眠从来不能解决线程安全,你觉得线程安全是因为你这里没有高并发
用休眠来保证线程安全还用什么线程,直接一个线程顺序执行更能保证安全