在多线程环境中,如何保证共享资源的合理使用。就可以引出这个设计模式。
场景:多个游客要验证身份后才能通过检票口
| 角色 | 作用 |
|---|---|
| Gate | 资源、 并提供方法使用资源 |
| User | 使用资源的地方 |
| Client | 模拟多个线程使用资源 |
代码演示:
public class Gate {
private String name;
private String address;
private int counter;
// synchronized 保证线程的安全性
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 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 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();
}
}

本文通过一个具体的检票口场景,介绍了在多线程环境下如何利用synchronized关键字来保证共享资源Gate的安全访问。多个User线程尝试通过Gate进行身份验证,synchronized确保了在任何时刻只有一个线程可以修改Gate的状态,避免了资源冲突。
2422

被折叠的 条评论
为什么被折叠?



