杜贤胜 2021-11-18 00:55 采纳率: 33.3%
浏览 38
已结题

java线程安全问题 提出的问题在最后代码块注释中 Thread.sleep(3000)哪一行里


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)哪一行里

  • 写回答

4条回答 默认 最新

  • 能力工场小马哥 2021-11-18 09:49
    关注

    首先, 代码层面上用休眠是否解决了线程安全问题?
    答: 在你这个demo里面, 没有线程安全问题; 作为学习, 是可以这样做试验的.
    但是呢, 多说几句:
    多线程或者并发编程的意义, 是为了提高CPU使用率以及系统的业务处理能力,说白了就是单位时间内多干活, 如果有个线程在"消极怠工", 例如, 它在读网络, 读磁盘...等, 这种操作相比cpu的速度很慢, 那么就把CPU时间贡献给最需要的线程.这样整体的执行效率会提高.
    所以, 在这个层面上, 你的代码只能是demo, 违背了多线程并发的意义.
    既然不能用休眠来解决线程安全问题, 那么如何处理呢?
    答案是: 同步. 例如(常见的synchronized, 或者其它对锁的优化方案等)
    希望我的回答能给你带来进一步思考, 有问题继续交流.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 11月26日
  • 已采纳回答 11月18日
  • 创建了问题 11月18日

悬赏问题

  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加
  • ¥15 用ns3仿真出5G核心网网元
  • ¥15 matlab答疑 关于海上风电的爬坡事件检测
  • ¥88 python部署量化回测异常问题