线程同步机制
多个线程操作同一个资源 关键字synchronized 形成条件 : 队列 和 锁
并发
三大不安全案例
案例一、买票案例
public class UnsafeBuyTicket {
public static void main ( String [ ] args) {
BuyTicket b = new BuyTicket ( ) ;
new Thread ( b, "a" ) . start ( ) ;
new Thread ( b, "b" ) . start ( ) ;
new Thread ( b, "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 , "结婚基金" ) ;
Drawing you= new Drawing ( account, 50 , "你" ) ;
Drawing grilfriend= new Drawing ( account, 100 , "grilfriend" ) ;
you. start ( ) ;
grilfriend. start ( ) ;
}
}
class Account {
int money;
String name;
public Account ( int money, String name) {
super ( ) ;
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 ( 1000 ) ;
} 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) ;
}
}
案例三、线程不安全的集合
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 ( ) ) ;
}
}