多線程學習(一)銀行存取款

今天同窗問到銀行存取款,如何保持同步,隨手寫了一個簡單例子.java

首先是銀行:ide

private int money = 1000;
    
    public synchronized void add(int n) {
        money += n;
        try {
            Thread.sleep(1000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + "----餘額: " + money);
    }
    
    public synchronized void reduce(int n) {
        if(money - n >= 0) {
            money -= n;
        } else {
            System.out.println("餘額不足");
        }
        try {
            Thread.sleep(1000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + "----餘額: " + money);
    }測試

其中關鍵在於方法加鎖,利用的是java內置的互斥鎖機制.this

接下來就是用戶:.net

    public Bank bank;
    static final String TYPE_ADD = "add";  
    static final String TYPE_REDUCE = "reduce";
    private String type;  
    private int time;
    private int money;  
    public Customer() {  
    }  
 
    public Customer(Bank bank, String type, int time, int money) {  
        this.bank = bank;  
        this.type = type;  
        this.time = time;  
        this.money = money;  
    }
    
    @Override
    public void run() {
        for(int i = 0; i < time; i++) {
            if (TYPE_ADD.equals(type)) {  
                bank.add(money);  
            } else if (TYPE_REDUCE.equals(type)) {  
                bank.reduce(money);  
            }
        }
    }get

最後是測試類:同步

    Bank bank = new Bank();
        Customer a1 = new Customer(bank, Customer.TYPE_ADD, 10, 100);
        Customer a2 = new Customer(bank, Customer.TYPE_REDUCE, 10, 100);
        
        Thread t1 = new Thread(a1);
        Thread t2 = new Thread(a2);
        t1.start();
        t2.start();io

相關文章
相關標籤/搜索