21 有一个门,始终只让一个人通过
文章目录
- 引入
引入

-
这个门,在并发编程里面,扮演的角色就是共享资源(临界区)
-
人:就是操作这个公共资源的线程
-
Gate
package study.wyy.concurrency.single;/*** @author :wyaoyao* @date : 2020-04-27 20:57** 门:相当于共享资源*/
public class Gate {// 记录通过的人数private int counter = 0;// 记录通过的人的nameprivate String name = "Nobody";// 记录通过的人的addressprivate String address = "NoAddress";public void pass(String name,String address){this.counter++;this.address = address;this.name = name;verify();}/*** 随便写的一个检查:name和address的首字母要一样*/private void verify() {if(this.name.charAt(0) != this.address.charAt(0)){System.out.println("*******BROKEN********" + toString());}}@Overridepublic String toString() {return "NO." + counter + ":" + name + "," + address;}
}
- 人:user
package study.wyy.concurrency.single;import lombok.extern.slf4j.Slf4j;/*** @author :wyaoyao* @date : 2020-04-27 21:09* 人:相当于使用共享资源--》线程*/
@Slf4j
public class User extends Thread {private final String name;private final String address;private final Gate gate;public User(String name, String address, Gate gate) {this.name = name;this.address = address;this.gate = gate;}// 重写run@Overridepublic void run() {log.info("{} Begin", name);// 不断的通过这个门while (true){this.gate.pass(this.name,this.address);}}
}
- 测试
public class Client {public static void main(String[] args) {// 创建一个gateGate 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();}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zZEGA16p-1599739155199)(evernotecid://FA2713E9-40BE-49E5-BF9D-E3ACD77E4128/appyinxiangcom/21741088/ENResource/p579)]
解决很简单:加锁
/*** @author :wyaoyao* @date : 2020-04-27 20:57** 门:相当于共享资源*/
public class Gate {// 记录通过的人数private int counter = 0;// 记录通过的人的nameprivate String name = "Nobody";// 记录通过的人的addressprivate String address = "NoAddress";public synchronized void pass(String name,String address){this.counter++;this.address = address;this.name = name;verify();}/*** 随便写的一个检查:name和address的首字母要一样*/private void verify() {if(this.name.charAt(0) != this.address.charAt(0)){System.out.println("*******BROKEN********" + toString());}}@Overridepublic synchronized String toString() {return "NO." + counter + ":" + name + "," + address;}
}
但是:verify,toString都是读的操作,加锁会影响执行效率:读写分离
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
