Java线程不安全例子

 

线程不安全例子 ABC买票 有人拿到一样的票或者拿到负数

public class UnafeBuyTicket
{
    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){
            buy(); //调用买票
        }
    }
    private void buy() {//是否有票
        if (ticketNums<=0){
            flag =false;//停止标志移位
            return;
        }
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+ " 买到第 "+ ticketNums--);
    }
}

 

二个人同时取钱

public class UnsafeBank {
    public static void main(String[] args) {
        Account account = new Account(100,"结婚");
        Update you = new Update(account,50,"You");
        Update girl = new Update(account,100,"girlFriend");
        girl.start();
        you.start();
​
    }
}
class Account{
    int money; //账户上的钱
    String name; //账户名字
​
    public Account(int money, String name) {
        this.money = money;
        this.name = name;
    }
}
//模拟取钱
class Update extends Thread{
    Account account; //账户
    int drawingMoney; //取出的钱
    int nowMoney; //手里的钱
    public Update(Account account, int drawingMoney, String name){
        super(name); // Thread(String name) 线程名字
        this.account=account;
        this.drawingMoney =drawingMoney;
    }
    //取钱
    @Override
    public void run(){
        if(account.money-drawingMoney<0){
            System.out.println(Thread.currentThread().getName()+" 钱不够");
            return;
        }
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        account.money = account.money -drawingMoney;
        nowMoney = nowMoney + drawingMoney;
        System.out.println(account.name+"余额: "+account.money);
        System.out.println(this.getName()+ "手里钱: "+ nowMoney);
    }
}

 

ArrayList 线程不安全 内存有相互的覆盖不安全

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());
    }
​
}
//内存空间有相互覆盖的情况线程不安全
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值