线程不安全的案例
买票
//不安全的卖票
//线程不安全有负数
public class UnsafeBuyTicket {
public static void main(String[] args) {
BuyTicket station = new BuyTicket();
new Thread(station,"我").start();
new Thread(station,"你们").start();
new Thread(station,"黄牛").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 , "结婚基金" ) ;
Drawing you = new Drawing ( account, 50 , "你" ) ;
Drawing girlFriend = new Drawing ( 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 Drawing extends Thread {
Account account ;
int drawingMoney;
int nowMoney;
public Drawing ( 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 ;
}
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) ;
}
}
线程不安全
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 ( 100 ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
System . out. println ( list. size ( ) ) ;
}
}