线程不安全例子 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());
}
}
//内存空间有相互覆盖的情况线程不安全