java多线程售票小例子

来源:互联网 发布:双十一淘宝买机票 编辑:程序博客网 时间:2024/05/16 05:31

java多线程售票小例子

1、错误示范

class SellThread implements Runnable {    private int i = 20;    public void run() {        while(true) {            if(i > 0) {                try {                    Thread.sleep(100);                } catch(Exception e) {                }                System.out.println(Thread.currentThread().getName() + "sell " + i--);               }        }    }}public class Test {    public static void main(String[] args) {        SellThread sell = new SellThread();        Thread sell1 = new Thread(sell, "sellman1");        Thread sell2 = new Thread(sell, "sellman2");        Thread sell3 = new Thread(sell, "sellman3");        sell1.start();        sell2.start();              sell3.start();    }}

没有同步控制变量,所以最后出现了-1张票

这里写图片描述


2、正确示范

class SellThread implements Runnable {    private int i = 20;    String key = "";    public void run() {        while(true) {            synchronized(key) {                if(i > 0) {                    try {                    Thread.sleep(100);                    } catch(Exception e) {                    }                    System.out.println(Thread.currentThread().getName() + "sell " + i--);                   }else {                    break;                }            }        }    }}public class Test {    public static void main(String[] args) {        SellThread sell = new SellThread();        Thread sell1 = new Thread(sell, "sellman1");        Thread sell2 = new Thread(sell, "sellman2");        Thread sell3 = new Thread(sell, "sellman3");        sell1.start();        sell2.start();              sell3.start();    }}

这里写图片描述


补充:如果用synchronized关键字修饰方法,则只能有一个线程获取访问这段方法的权限。也就是说,一个线程把票买完了才结束。

class SellThread implements Runnable {    private int i = 20;    String key = "";    public synchronized void run() {        while(true) {            if(i > 0) {                try {                    Thread.sleep(100);                    } catch(Exception e) {                    }                    System.out.println(Thread.currentThread().getName() + "sell " + i--);                                   }else {                break;            }        }    }}public class Test {    public static void main(String[] args) {        SellThread sell = new SellThread();        Thread sell1 = new Thread(sell, "sellman1");        Thread sell2 = new Thread(sell, "sellman2");        Thread sell3 = new Thread(sell, "sellman3");        sell1.start();        sell2.start();              sell3.start();    }}

这里写图片描述

总结:

1、synchronized()括号中需要的是一个对象,所以这里使用了String类的一个对象key,可以用this来代替key。

2、一个线程拿到synchronized括号中的对象以后,其他线程也是可以执行的,但是当它们需要用key的时候,发现key已经被别人拿走了,只能等着key被释放了。就像上厕所,坑被别人占了,只能等着了,但是等着的时候我还可以运行,比如玩玩手机什么的。

3、synchronized method(){} 可以防止多个线程同时访问这个对象的synchronized方法;如果一个对象A,有多个synchronized方法,只要一个线程访问了其中的一个,那么其他线程不能同时访问A的任何一个synchronized方法。但是可以访问对象B的synchronized方法。

4、synchronized static method(){} 可以防止多个线程同时访问这个的synchronized方法;对类的所有对象均起作用,无论对象A、对象B、对象C的。

关于3、4,请参考 http://www.cnblogs.com/yanghuahui/p/3365922.html

这里写图片描述

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 被判定虚假物流怎么办 淘宝有虚假交易怎么办 微信辅助不了怎么办 微信验证失败怎么办 淘宝占空间太大怎么办 淘宝占用空间大怎么办 ipad空间不够用怎么办 ipadmini密码忘了怎么办 旧ipad特别卡怎么办 苹果ipad反应慢怎么办 手机垃圾多了怎么办 ipad2内存过低怎么办 苹果平板ipad内存不足怎么办 手机dns配置错误怎么办 蓝牙已停止运行怎么办 ipad看电视闪退怎么办 ipad为什么看电视会闪退怎么办 微淘直播延迟怎么办 手机淘宝进群领金币怎么办 做淘客冲销量停止淘客后怎么办 微信中零钱提现怎么办 淘宝买家不签收怎么办 小龙虾没人下单怎么办 淘宝直播不浮现怎么办 淘宝直播看不了怎么办 理财客户说没钱怎么办 投资不给钱了怎么办 工作中遇到挫折怎么办 手机qq出现异常怎么办 农行卡出现异常怎么办 淘宝长期不发货怎么办 快递一直不发货怎么办 申请退款被拒绝怎么办 淘宝的垃圾短信怎么办 如果淘宝不退款怎么办 客服遇到客户骂怎么办 商场保证金不退怎么办 淘宝被投诉侵权怎么办 电脑wifi链接不见了怎么办 无线设备坏了怎么办 电脑网页默认了怎么办