review38

Java程序中可以存在多个线程,但是在处理多线程问题时,必须注意这样一个问题:当两个或多个线程同时访问同一个变量,并且一些线程需要修改这个变量。这时可能发生混乱。

所谓线程同步就是若干个线程都需要一个synchronized(同步)修饰的方法。

线程同步机制:当一个线程A使用synchronized方法时,其他线程想使用这个synchronized方法时就必须等待,直到线程A使用完该synchronized方法。

public class Test04 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Bank bank = new Bank();
        bank.setMoney(200);
        Thread accountant, cashier;
        accountant = new Thread(bank);
        cashier = new Thread(bank);
        accountant.setName("会计");
        cashier.setName("出纳");
        accountant.start();
        cashier.start();
    }

}

Bank.java

public class Bank implements Runnable {

    int money = 200;
    public void setMoney(int n)
    {
        money = n;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        if(Thread.currentThread().getName().equals("会计"))
        {
            saveOrTake(300);
        }
        else if(Thread.currentThread().getName().equals("出纳"))
        {
            saveOrTake(150);
        }
        
    }
    
    public synchronized void saveOrTake(int amount)
    {
        if(Thread.currentThread().getName().equals("会计"))
        {
            for(int i = 1; i <= 3; i++)
            {
                money = money + amount / 3;
                System.out.println(Thread.currentThread().getName() + "存入" 
                + amount/3 + ",帐上有" + money + "万,休息一会再存");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                
            }
        }
        else if(Thread.currentThread().getName().equals("出纳"))
        {
            for(int i = 1; i <= 3; i++)
            {
                money = money - amount / 3;
                System.out.println(Thread.currentThread().getName() + "取出" +
                amount/3 + ",账上有" + money + "万,休息一会儿再取");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

}

运行结果如下所示:

 

posted @ 2018-08-16 19:40  寒潭渡鹤影  阅读(79)  评论(0编辑  收藏  举报