代码都是照搬的 Java 2实用教程
Java 程序中可以存在多个线程,但是在处理多线程问题时,必须注意这样一个问题: 当两个或多个线程同时访问同一个变量,并且一些线程需要修改这个变量.程序应对这样的问题做出处理,否者就会混乱.
所谓线程同步就是若干个线程都需要使用一个synchronized同步的修饰方法,即程序中的若干线程都需要使用一个方法,而这个方法用synchronized给予了修饰.多个线程调用synchronized方法必须遵守同步机制.
简单点说就是一个线程A使用synchronized修饰的方法时,其他线程同样需要使用此方法那么必须等待,直到线程A用完此方法.一定要完全用完!
哎第一次写博客,我直接举例子吧
class Bank implements Runnable
{
int money=200;
public void setMoney(int n)
{
money=n;
}
public void run(){
if(Thread.currentThread().getName().equals("会计"))
saveOrTake(400);
else if(Thread.currentThread().getName().equals("出纳"))
saveOrTake(200);
}
public synchronized void saveOrTake(int amount)
{
if(Thread.currentThread().getName().equals("会计"))
{
for(int i=0;i<=3;i++)
{
money+=amount/4;
System.out.println("会计存入"+amount/4+"账户有"+money+"休息一会存");
try{
Thread.sleep(1000);
}
catch (Exception e) {
// TODO: handle exception
}
}
}
else if(Thread.currentThread().getName().equals("出纳"))
{
for(int i=0;i<=3;i++)
{
money-=amount/4;
System.out.println("出纳取出"+amount/4+"账户有"+money+"休息一会再取");
try{
Thread.sleep(1000);
}
catch (Exception e) {
// TODO: handle exception
}
}
}
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {
// Scanner in=new Scanner(System.in);
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();
}
}
运行结果:
如果我去掉synchronized 那么就会出现混乱不只是运行过程出现混乱出现"插队"的结果甚至运行结果也会出错
可以看出运行结果中出纳和会计同时对一个账本操作,这不符合我们的规定.运行结果中 1 2 的总体结果还没有问题但是到了3 的时候就出现了对帐户取出实际又没有修改账本的问题导致答案错误.并且每次运行的结果还不一样