Java多线程设计模式详解学习笔记三——SingleThreadExecution
来源:互联网 发布:python的for循环 编辑:程序博客网 时间:2024/06/04 17:58
public class Main {public static void main(String[] args) {Gate gate=new Gate();new UserThread(gate, "Alice", "Alaska").start(); new UserThread(gate, "Bobby", "Brazil").start(); new UserThread(gate, "Chris", "Canada").start();}}
public class Gate {private int count;private String name="Nobody";private String address="NoWhere";void pass(String name,String address){count++;this.name=name;try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}this.address=address;check();}private void check() {if (name.charAt(0)!=address.charAt(0)) {System.out.println("********BROKEN*********"+toString());}}@Overridepublic String toString() {try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}return "Count:"+count+" Namre:"+name+" Address:"+address;}}
public class UserThread extends Thread{private Gate gate;private String name;private String address;public UserThread(Gate gate,String name,String address) {this.gate=gate;this.name=name;this.address=address;}@Overridepublic void run() {System.out.println(name+"BEGIN");while(true){gate.pass(name, address);}}}
运行结构:
AliceBEGINBobbyBEGINChrisBEGIN********BROKEN*********Count:4 Namre:Bobby Address:Canada********BROKEN*********Count:6 Namre:Alice Address:Alaska********BROKEN*********Count:6 Namre:Alice Address:Alaska********BROKEN*********Count:9 Namre:Bobby Address:Brazil********BROKEN*********Count:10 Namre:Alice Address:Brazil********BROKEN*********Count:11 Namre:Chris Address:Canada********BROKEN*********Count:13 Namre:Bobby Address:Canada********BROKEN*********Count:15 Namre:Alice Address:Alaska********BROKEN*********Count:15 Namre:Alice Address:Alaska********BROKEN*********Count:18 Namre:Bobby Address:Brazil********BROKEN*********Count:19 Namre:Alice Address:Brazil********BROKEN*********Count:20 Namre:Chris Address:Canada********BROKEN*********Count:22 Namre:Bobby Address:Canada********BROKEN*********Count:24 Namre:Alice Address:Alaska********BROKEN*********Count:24 Namre:Alice Address:Alaska********BROKEN*********Count:27 Namre:Chris Address:Brazil********BROKEN*********Count:28 Namre:Alice Address:Brazil测试无法证明安全性:如果测试时找到错误,标明写好的程序并不安全。但是就算测试时没有找到错误也不能保证程序一定是安全的。当测试的次数不够,时间点部队,就可能检查不到问题。
在程序中Gate是SharedResource(共享资源),需要进行共享互斥的操作
public class Gate {private int count;private String name="Nobody";private String address="NoWhere";synchronized void pass(String name,String address){count++;this.name=name;try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}this.address=address;check();}private void check() {if (name.charAt(0)!=address.charAt(0)) {System.out.println("********BROKEN*********"+toString());}}@Overridepublic synchronized String toString() {try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}return "Count:"+count+" Namre:"+name+" Address:"+address;}}运行结果:
BobbyBEGINAliceBEGINChrisBEGINcheck()方法也有name和address字段,为什么没有加synchronized:
因为pass方法调用check()方法,而pass方法已经synchronized了,而check方法又是private的,所以不会有其他线程同时调用这个方法。
看到synchronized时就要思考这个synchronized是在保护什么。
- Java多线程设计模式详解学习笔记三——SingleThreadExecution
- java多线程设计模式之-SingleThreadExecution模式
- Java多线程设计模式详解学习笔记——Introduction1 Java语言的线程
- Java多线程设计模式详解学习笔记四——Immutable
- Java多线程设计模式详解学习笔记五——GuardedSuppension
- Java多线程设计模式详解学习笔记六——Balking
- Java多线程设计模式详解学习笔记七——Producer-Consumer
- Java多线程设计模式详解学习笔记八——Read-Write Lock Pattern
- Java多线程设计模式详解学习笔记九——Thread-Per-Message
- Java多线程设计模式详解学习笔记二
- java多线程设计模式——学习笔记(1)java语言的线程
- 学习Java 23种设计模式详解笔记之行为型模式(三)
- 《Java多线程编程核心技术》学习笔记(三)——Lock、Timer、单例模式
- 三、装饰模式——设计模式学习笔记
- 设计模式学习笔记(三)—-Strategy策略模式
- 设计模式学习笔记(三)—Strategy策略模式
- Java多线程设计模式-学习笔记-Balking模式.
- Java多线程设计模式-学习笔记-Produce/Consumer模式.
- ATT衰减和通信协议
- 根据table逆向生成的DAO类中方法总结
- 2011.8.17南京 船员全国会议中
- 非阻塞I/O笔记
- 几个图像处理源代码网站,cool-|walkfarer 发表于 2006-4-10 21:47:00
- Java多线程设计模式详解学习笔记三——SingleThreadExecution
- 对www.xici.net西祠胡同自动登陆的参数分析
- 标准支付宝交易服务接口规范-笔记
- 关于mysql版本升级后,原有的数据无法访问的解决方法,mysql错误代码:1558
- 八款开源Android游戏引擎
- 关于hash join的过程
- How Does Proxy ARP Work? And arp secured-arp?
- SQL WITH用法
- 教你如何获取索爱X10 Android2.1 Root权限