学习java多线程之synchronized

代码都是照搬的 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 的时候就出现了对帐户取出实际又没有修改账本的问题导致答案错误.并且每次运行的结果还不一样

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值