多线程(一、线程安全案例)
案例:
假设有四个人,频繁地通过海关出口,规定每次只能通过一个人,通过一个人时,将通过海关的总人次加1,同时记录该次通过人的姓名和出生地,如果出生地和名字不一致,不允许通过。
海关代码
package com.jane.service;
/**
* 海关入口
*/
public class GateWay {
private int counter = 0;
private String name = "无名";
private String address = "无地址";
#
/**
* 通行
* @param name
* @param address
*/
public void pass(String name, String address) {
this.counter++;
this.name = name;
this.address = address;
checkPassport();
}
/**
* 检查护照
*/
private void checkPassport() {
//名字和地址匹配上才能通过
if(!this.name.equals(this.address)) {
System.out.println("禁止通行:" + "第" + this.counter + "人,姓名:" + this.name + ",来自:" + this.address);
}
}
}
人的代码
package com.jane.service;
/**
* 人模拟线程,循环入关
*/
public class Person extends Thread{
private final GateWay gateWay;
private final String name;
private final String address;
public Person(GateWay gateWay, String name, String address) {
this.gateWay = gateWay;
this.name = name;
this.address = address;
}
public void run() {
System.out.println(this.name + ",开始入关");
while(true) {
this.gateWay.pass(this.name, this.address);
}
}
}
启动函数
System.out.println("开始入关");
GateWay gate = new GateWay();
new Person(gate, "张三", "张三").start();
new Person(gate, "李四", "李四").start();
new Person(gate, "王五", "王五").start();
new Person(gate, "赵六", "赵六").start();
运行结果
线程不安全!!!!!!!!!!!!