模拟银行取钱,和火车票代售

关键字:synchronized同步锁,每一个类和对象都有把锁,一个是关一个是开,注意操作的都是统一个对象。
模拟ATM和存折取钱。

package cn.huaxin.syn;

public class Account {
    public double money = 1000;

    public void getMoney(double m) {
        if (money >= m) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            money -= m;
            System.out.println("取钱成功余额" + money);
        } else {
            System.out.println("余额不足");
        }
    }

    // 每个对象,类都有一把锁 一个是开,一个关
    public void getMoney(final double m, String method) {
        new Thread() {
            public void run() {
                // 内部类去访问变量在jdk1.8之前,需要把局部变量改成final
                synchronized (Account.class) {

                    if (money >= m) {
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        money -= m;
                        System.out.println("取钱成功余额" + money);
                    } else {
                        System.out.println("余额不足");
                    }
                }
            };

        }.start();
    }
}

package cn.huaxin.syn;

public class Test {

public static void main(String[] args) {
    Account ac = new Account();
    // ac.getMoney(900);
    // ac.getMoney(900);
    // 不同线程去修改同一个(money)
    ac.getMoney(900, "ATM");
    ac.getMoney(900, "存折");
    System.out.println("main end");
}

}

打印结果:main end
取钱成功余额100.0
余额不足

    public class Sell implements Runnable{
        public static void main(String[]args){
            Sell sell = new Sell();
            new Thread(sell).start();
            new Thread(sell).start();
            new Thread(sell).start();
    }
     public void run(){
       //票数
       int num = 100;
        while(true){
            synchronized (this){
                if(num<=0){
                    break;
                    System.out.println("卖完了");
                }
                Thread th = Thread.currentThread();
                    String name = th.getName();  
                    Sytem.out.println(name);
                    num--;
        }
        }try {
            Thread.sleep(20);
        } catch (InterruptedException e) {
            e.printStackTrace();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值