同一个时刻只能有一个线程访问共享资源,以牺牲性能为代价的
使用Synchronized修饰访问资源或者使用Lock
public class FlightSecurity{
private int count = 0;
//登机牌
private String boardingPass = null;
private String idCard = null;
//如果不加synchronized修饰,由于多个线程对pass访问,无法保证原子性
public synchronized void pass(String boardingPass,String idCard){
this.boardingPass = boardingPass;
this.idCard = idCard;
count++;
check();
}
private void check(){
if(boardingPass.charAt(0) != idCard.charAt(0)){
throw new RuntimeException(toString())
}
}
public String toString(){
return "The " + count +"boardingPass=["+boardingPass+"] idCard=["+idCard+"]";
}
}
public class FlightSecurityTest
{
static class Passengers extends Thread{
private final FlightSecurity flightSecurity;
private final String idCard;
private final String boardingPass;
public Passengers(FlightSecurity flightSecurity,String irCard,String boardingPass){
this.flightSecurity= flightSecurity;
this.idCard = idCard;
this.boardingPass =boardingPass;
}
public void run(){
while(true){
flightSecurity.pass(boardingPass,idCard);
}
}
}
}