线程不安全例子

并发:同一个对象被多个线程同时操作

 

不安全抢票

查看代码

package com.lei.syn;

public class UnsafeBuyTicket {
    public static void main(String[] args) {
        BuyTicket buyTicket=new BuyTicket();

        new Thread(buyTicket,"A").start();
        new Thread(buyTicket,"B").start();
        new Thread(buyTicket,"C").start();
    }
    }


class BuyTicket implements Runnable{

    //票
    private int ticketNums=10;
    boolean flag=true;
    @Override
    public void run() {
        //买票
        while (flag){
            try {
                Buy();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    private void Buy() throws InterruptedException {
        if(ticketNums<=0){
            flag=false;
            return;
        }
        //模拟延时
        Thread.sleep(1000);

        //买票
        System.out.println(Thread.currentThread().getName()+"拿到第"+ticketNums--+"张票");
    }
}

不安全银行取钱

查看代码

package com.lei.syn;

public class UnsafeFeBand {
    public static void main(String[] args) {
        Account account = new Account(100, "结婚基金");

        Drawing you = new Drawing(account,50,"你");
        Drawing girlfriend = new Drawing(account, 100, "女朋友");

        you.start();
        girlfriend.start();
    }
}

//账户
class Account{
     int money;//余额
     String name;//卡号

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

//银行:模拟取款
class Drawing extends Thread{
    Account account;//账户
    //取了多少钱
    int drawingMoney;
    //现在手里多少钱
    int nowMoney;

    String name;

    public Drawing(Account account, int drawingMoney, String name){
        this.account=account;
        this.drawingMoney=drawingMoney;
        this.name=name;
    }

    //取钱
    @Override
    public void run() {
       //判断有没有钱
        if(account.money-drawingMoney<0){
            System.out.println(name + "钱不够,取不了");
            return;
        }

        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()因为继承了Thread
        System.out.println(name+"手里的钱"+nowMoney);
    }
}

同一时间被添加进去,线程不安全

package com.lei.syn;

import java.util.ArrayList;
import java.util.List;

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

posted @ 2022-04-13 15:14  Eveeee  阅读(43)  评论(0)    收藏  举报