随笔 - 172  文章 - 0  评论 - 0  阅读 - 11939

Java 多线程(七)三大不安全案例

一,买票

复制代码
//不安全买票
public class UnsafeBuyTickets {
public static void main(String[] args) {
BuyTickets buyTickets = new BuyTickets();
new Thread(buyTickets,"黄牛").start();
new Thread(buyTickets,"平民").start();
new Thread(buyTickets,"贵族").start();
new Thread(buyTickets,"皇室").start();
}
}

class BuyTickets implements Runnable{
private int ticketsNum = 10;
boolean flag = true;
@Override
public void run() {
while(flag){
buy();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void buy (){
if (ticketsNum <=0){
flag = false;
return;
}
System.out.println(Thread.currentThread().getName()+"拿到了第"+ticketsNum--+"张票!");
}
}
复制代码

结果会看到负数:

 

二,取钱

复制代码
//不安全取钱
public class UnsafeBank {
    public static void main(String[] args) {
        //账户
        Account account = new Account(100, "结婚基金");
        Draw you = new Draw(account,50,"你");
        Draw girlFriend = new Draw(account,100,"girlFriend");
        you.start();
        girlFriend.start();
    }
}

//账户
class Account{
    int money ;
    String name;

    public Account(int money, String name) {
        this.money = money;
        this.name = name;
    }
}
//取钱
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(Thread.currentThread().getName()+"余额不足");
            return;
        }
        //sleep
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //卡内余额=卡里余额-取出钱
        account.money = account.money-drawingMoney;
        //手里钱=手里钱+取出钱
        nowMoney = nowMoney+drawingMoney;
        System.out.println(account.name+"余额为:"+account.money);
        //Thread.currentThread().getName()等价于this.getName()
        System.out.println(this.getName()+"手里的钱:"+nowMoney);
    }
}
复制代码

结果看到负数:

 

三,不安全集合

复制代码
//线程不安全的集合
public class UnsafeList {
    public static void main(String[] args) throws InterruptedException {
        List<String> list = new ArrayList<String>();
        for (int i = 0; i < 10000; i++) {
            new Thread(()->{
                list.add(Thread.currentThread().getName());
            }).start();
        }
        Thread.sleep(3000);
        System.out.println(list.size());
    }
}
复制代码

结果看到集合中数量不够应该是有10000个:

 

posted on   键盘敲烂的朱  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示