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(); } } } } }
运行结果如下所示: