19 线程不安全的例子

发布时间 2023-09-07 20:24:04作者: 被占用的小海海
package ThreadDemo;

import java.util.ArrayList;
import java.util.List;
// 线程可能不安全
/*
  1.买火车票
  2.银行取钱
  3.线程不安全的 数组列表
 */

public class Test18_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();
        }
        System.out.println(list.size()); // 结果不是10000,因为可能覆盖率
    }
}
package ThreadDemo;

public class Test17_UnsafeBank {
    public static void main(String[] args) throws InterruptedException {
        Account account = new Account(100, "生活费");

        Bank bank = new Bank(account, "我", -20);
        new Thread(bank,"我").start();

        bank= new Bank(account,"哥哥",-40);  // 更新
        new Thread(bank,"哥哥").start();
    }
}


// 账户
class Account {
    int money;
    String name;  // 账户的名字
    public Account(int money, String name) {
        this.money = money;
        this.name = name;
    }
}

// 银行
class Bank implements Runnable{
    Account account;
    String name;   // 操作者(取钱或者存钱的人)
    int money;

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

    @Override
    public void run() {
//  synchronized (){} 块:锁住某一特定的对象
        
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            account.money=account.money+money;
            if (account.money<=0){
                System.out.println("账户里面钱不够");
                return;
            }
            System.out.println(Thread.currentThread().getName()+"往账户里面:"+money);
            System.out.println("账户里面还剩:"+account.money);


    }
}