• 线程安全问题


    线程安全问题指的是:多个线程同时操作一个共享资源的时候,可能会出现业务安全问题,

    一般发生与同事修改同一个共享资源时。

    我一下面这段代码举例:

    首先是这一个共享的账户类People,它包含updateMoney()方法,用于修改里面存储的金额Money,

    1. public class People {
    2. private double money;
    3. public People() {
    4. }
    5. public People(double money) {
    6. this.money = money;
    7. }
    8. public double getMoney() {
    9. return money;
    10. }
    11. public void setMoney(double money) {
    12. this.money = money;
    13. }
    14. public void updateMoney(double price){
    15. System.out.println("当前线程已经连接账户,账户余额:"+money);
    16. System.out.println(Thread.currentThread().getName()+"取钱:"+price);
    17. money-=price;
    18. System.out.println("账户余额:"+money);
    19. }
    20. }

    其次是它的主类;

    1. public class Test1 {
    2. public static void main(String[] args) throws Exception {
    3. People people=new People(1000.0);//在账户中放入1000元
    4. //创建两个线程
    5. new MyThread(people,"1号").start();
    6. new MyThread(people,"2号").start();
    7. }
    8. }
    9. class MyThread extends Thread{
    10. private People people;
    11. public MyThread(People people,String name) {
    12. super(name);
    13. this.people=people;
    14. }
    15. @Override
    16. public void run(){
    17. //调用People的方法,从中取出1000元;
    18. people.updateMoney(1000.0);
    19. }
    20. }

    当然,这是有问题的,创建的两个线程同时执行,它们会同时从People中取出1000元,而本来People中就只有1000元,name就会造成以下的结果;

    当前线程已经连接账户,账户余额:1000.0
    当前线程已经连接账户,账户余额:1000.0
    2号取钱:1000.0
    1号取钱:1000.0
    账户余额:0.0
    账户余额:-1000.0
     

    这样就造成了线程安全问题

  • 相关阅读:
    ES6-ES12部分简单知识点总结,希望对大家有用~
    进程优先级、切换、调度
    base64编解码
    Chrome 配置samesite=none方式
    Vue高级篇--实现前后端分离
    预训练模型的多任务主动学习
    Starday影响者视频能给你提升80%的流量?
    【Rust基础②】流程控制、模式匹配
    为了拿捏后端打工人都要会的 Redis 数据结构,我画了 20 张图
    武汉星起航:做亚马逊最常见的错误思想
  • 原文地址:https://blog.csdn.net/weixin_66344432/article/details/125460487