线程不安全案例

三大不安全案例

案例1:

package xianchengBuAnquan;

public class test implements Runnable {

    private int ticket = 10;
    boolean falg = true;

    @Override
    public void run() {
        while (falg) {
            buy();
        }
    }

    private void buy() {
        if (ticket <= 0) {
            falg = false;
            return;
        }
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + "买票第几张" + ticket--);
    }

    public static void main(String[] args) {
        test test = new test();
        new Thread(test, "小红").start();
        new Thread(test, "小黑").start();
        new Thread(test, "小白").start();
    }
}

运行结果

 

案例2:

package xianchengBuAnquan;

public class unSafeBank {
    public static void main(String[] args) {
        Account account = new Account(100, "建行");
        draw myselfe = new draw(account, 50, "myselfe");
        draw girlPrent = new draw(account, 100, "girlPrent");
        //new Thread(myselfe).start(); 实现runnAble接口方法
        myselfe.start();
        girlPrent.start();
    }
}

class draw extends Thread {
    Account account;
    int drawIngMoney;
    int nowMoney;

    public draw(Account account, int drawIngMoney, String name) {
        super(name);
        this.account = account;
        this.drawIngMoney = drawIngMoney;
    }

    @Override
    public void run() {
        if (account.money - drawIngMoney < 0) {
            System.out.println(this.getName() + "取钱时" + account.bangName + "账户余额的钱不够,取不了");
            return;
        }

        // 方法问题的不安全性
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 卡内余额
        account.money = account.money - drawIngMoney;

        // 手里的钱+银行取得钱
        nowMoney = nowMoney + drawIngMoney;

        System.out.println(this.getName() + "手里的钱: " + nowMoney);
        System.out.println(account.bangName + "账户余额: " + account.money);
    }

}

//银行账户信息
class Account {
    int money;
    String bangName;

    public Account(int money, String bangName) {
        this.money = money;
        this.bangName = bangName;
    }
}

 运行结果:

案例3:

 懒得沾代码了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值