在我们的业务开发中,在多线程的情况下始终会有资源的公用,就是共享资源的使用,这个时候我们怎么保证线程的安全性呢?
我们模拟一个场景:多个游客要验证身份通过一道门
三个类:
1.User 是使用资源的地方,也就是每一个用户,或者说是通过门的游客
2.Gate:相当于一个资源 调用一个方法pass 方法
3.SingleClient 当User跑起来的时候不断的使用这个资源
public class User extends Thread {
private String name,address;
private Gate gate;
public User(String name, String address, Gate gate) {
this.name = name;
this.address = address;
this.gate = gate;
}
@Override
public void run() {
System.out.println("user = [name : " + name + " address = " + address + " ]");
while (true){
gate.pass(name,address);
}
}
}
public class Gate {
private String name,address;
private int counter ;
public synchronized void pass(String name ,String address){
this.name = name;
this.address = address;
counter ++;
check();
}
private void check() {
if(name.charAt(0)!= address.charAt(0)){
System.out.println("BROKEN * NO." + counter + toString());
}
}
@Override
public String toString() {
return " name =" + name + " address = " +address;
}
}
public class Client
{
public static void main(String[] args){
Gate gate = new Gate();
User bj = new User("BaoBao","Beijing",gate);
User sh = new User("ShangLao","Shanghai",gate);
User gz = new User("GuangLao","Guangzhou",gate);
bj.start();
sh.start();
gz.start();
}
}
如果在pass方法上不加锁,输出的结果是:
这个原因是多线程操作共享资源,不能保证线程同步。
pass方法上加锁,这样没有输出就是一直是相同,一直执行。