Java 数据在多线程并发的情况下的安全性问题 银行取款多线程的安全性问题1

Java 数据在多线程并发的情况下的安全性问题 银行取款多线程的安全性问题1,第1张

Java 数据在多线程并发的情况下的安全性问题 银行取款多线程的安全性问题1 当具备以下三种情况时,我们就需要考虑数据在多线程并发的情况下的安全性问题了

1、多线程并发
2、有共享数据
3、并发的线程对共享的数据有更新的 *** 作

如何解决线程并发的安全性问题:

使用的方法为使用线程同步机制(线程同步就是线程排队执行),效率会低但是可以保证数据的安全,

线程同步

1、同步编程模型
线程之间轮流执行,一个线程执行完之后,一个线程一个线程才能开始执行,不同同时执行,同步编程模型时线程之间会排队进行。
2、异步编程模型
线程之间谁也不影响谁,线程之间同步进行。也可以称为线程的并发执行。

class Account
package DuoXianCheng;

public class Account {
    private String accout;
    private double bluance;

    public Account() {
    }

    public Account(String accout, double bluance) {
        this.accout = accout;
        this.bluance = bluance;
    }

    public String getAccout() {
        return accout;
    }

    public void setAccout(String accout) {
        this.accout = accout;
    }

    public double getBluance() {
        return bluance;
    }

    public void setBluance(double bluance) {
        this.bluance = bluance;
    }
    public void quKuan(double bluance,AccountThread accountThread){
        double before = this.getBluance();
        double after =  before-bluance;
        if(accountThread.getName().equals("t2")){//在这里如果将t2改为t1的话,尽管我们对同一个账户做了两次取款 *** 作,但是账户余额的变化只会有记录一次取款 *** 作 
            try {
                accountThread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.setBluance(after);//这里还没有来的及更新第二次取款 *** 作已经获取到了未更新之前的余额,也就是说尽管我们做了两次取款 *** 作
        //但是我们是在相同的余额的情况下进行的,改变的是相同的余额。
        //这样 *** 作我们就可多获取一笔钱了。
    }
}

class Mian
package DuoXianCheng;

public class Mian {
    public static void main(String[] args) {
        Account account = new Account("001",10000);
        AccountThread t1 = new AccountThread(account);
        AccountThread t2 = new AccountThread(account);
        t1.setName("t1");
        t2.setName("t2");
        t1.start();
        t2.start();
    }
}
class AccountThread
package DuoXianCheng;

public class AccountThread extends Thread{
    Account account;

    public AccountThread(Account account) {
        this.account = account;
    }

    @Override
    public void run() {
        double money=5000;
        account.quKuan(money,this);
        System.out.println(Thread.currentThread().getName()+account.getAccout()+":"+account.getBluance());

    }
}

运行结果视图

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5677020.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存