博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Single Threaded Execution----能通过这座桥的,只有一个人
阅读量:5734 次
发布时间:2019-06-18

本文共 2236 字,大约阅读时间需要 7 分钟。

hot3.png

Single Threaded Execution----能通过这座桥的,只有一个人

 

当有一座小桥,每次只能通过一个人,如果同时有两个人在桥上,桥会断开如今有三个姓和名的首字母相同的人多次通过此桥

 

package com.quest.mchen2.thread.single_thread_execution;public class Gate {           private int counter=0;      private String name= "Nobody";      private String address= "Nowhere";           //为了防止多线程情况下对象先后交叉执行,从而导致将共享实例的字段改写了      public synchronized void pass(String name, String address){            this. counter++;            this. name=name;            this. address=address;            check();     }           @Override      public synchronized String toString() {            // TODO Auto-generated method stub            return "No."+ counter+ ":"+ name+ ", "+ address;     }           private void check(){            if( name.charAt(0)!= address.charAt(0)){                System. out.println( "*****BROKEN*****" +toString());           }     }}package com.quest.mchen2.thread.single_thread_execution;public class UserThread extends Thread{      private final Gate gate;      private final String myname;      private final String myaddress;           public UserThread(Gate gate, String myname, String myaddress){            this. gate=gate;            this. myname=myname;            this. myaddress=myaddress;     }           @Override      public void run() {            // TODO Auto-generated method stub           System. out.println( myname+ " BEGIN");            while( true){                 gate. pass( myname, myaddress);           }     }     }package com.quest.mchen2.thread.single_thread_execution;public class Main {      /**      * @param args      */      public static void main(String[] args) {            // TODO Auto-generated method stub                      System. out.println( "Testing Gate, hit CTRL+C to exit");           Gate gate= new Gate();            new UserThread(gate, "Alice", "Alaska").start();            new UserThread(gate, "Bobby", "Brazil").start();            new UserThread(gate, "Chris", "Canada").start();     }}

 

由于在Gate类的pass方法加上了synchronized  所以可以阻止name与address的首字母出现的情况
toString()加上synchronized是因为当别的线程X调用toString。线程X在引用name字段的值之后到引用addresszi字段之间,UserThread的线程
可能会改掉address的值,这样一来,toString方法可能对线程使用name与address第一个字母不一致的值来构成字符串

 

 

 

转载于:https://my.oschina.net/mondchan/blog/73968

你可能感兴趣的文章
RabbitMQ】三种Exchange模式——订阅、路由、通配符模式
查看>>
连接数据库——java
查看>>
拥在怀里
查看>>
chm文件打开,有目录无内容
查看>>
whereis、find、which、locate的区别
查看>>
一点不懂到小白的linux系统运维经历分享
查看>>
MDT 2013 从入门到精通之软件自动化部署设置
查看>>
桌面支持--打不开网页上的pdf附件解决办法(ie-tools-compatibility)
查看>>
桌面支持--outlook取消收件规则1
查看>>
nagios监控windows 改了NSclient++默认端口 注意事项
查看>>
干货 | JAVA代码引起的NATIVE野指针问题(上)
查看>>
POI getDataFormat() 格式对照
查看>>
Python 中的进程、线程、协程、同步、异步、回调
查看>>
好的产品原型具有哪些特点?
查看>>
实现java导出文件弹出下载框让用户选择路径
查看>>
刨根问底--技术--jsoup登陆网站
查看>>
OSChina 五一劳动节乱弹 ——女孩子晚上不要出门,发生了这样的事情
查看>>
[译]是时候使用Javascript严格模式了
查看>>
Spring--通过注解来配置bean
查看>>
pandas 十分钟入门
查看>>