码迷,mamicode.com
首页 > 编程语言 > 详细

线程同步归纳总结

时间:2016-05-12 22:54:53      阅读:241      评论:0      收藏:0      [点我收藏+]

标签:

“多线程”在大型软件程序中有着很广泛的应用,其优点如下:
第一,将原来在一个大流程中实现的功能放到了多个小流程中,程序更加的简洁和易于阅读。
第二,将不同的功能放到不同的线程中,提高了程序的执行效率。
第三,“多线程”使得程序的模块化更强,有利于追踪程序执行过程和排查问题。

1:为什么要线程同步?

线程同步是为了防止多个线程访问一个数据对象时,对数据造成破坏。
线程的同步是保证多线程安全访问资源的一种手段。

2:同步和锁

Java中每一个对象都有一个内置锁。
当程序运行到synchronized同步代码块时,自动获得锁定对象的锁。
一个对象只有一个锁。所以,如果一个线程获得该锁,就没有其他线程可以获得锁,直到第一个线程释放锁。
这也意味着任何其他线程都不能进入synchronized方法或代码块,直到该锁被释放。
释放锁是指持锁线程退出了synchronized同步方法或代码块。

3:代码举例

Talk is cheap,Just show me the code!(代码举例说明)

示例需求:
某银行卡账号上有500元现金。一个人拿着存折去取钱,同时另一个人拿着卡去ATM上取钱,各自取钱400元。
要求取钱过程中不能出现资源竞争:比如400元被取出两次,银行卡的账目不能小于0。

 class Bank {
      private int money = 500;

      // 取钱的方法,返回取钱的数目
      //当一个线程去调用同步方法的时候,这个线程就获取了当前对象的锁。
      //其他线程当调用同步方法的时候只能等待,因为无法获取对象的锁,
      //只有等第一个线程释放对象的锁方可进入
      public synchronized int getMoney(int number) {
          synchronized (this) {
             if (number < 0) {
                 return -1;
             } else if (money < 0) {
                 return -2;
             } else if (number - money > 0) {
                 return -3;
             } else {
                 try {
                     Thread.sleep(1000);// 模拟取钱的时间
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
                 money -= number;
                 System.out.println("余额:" + money);
             }
             return number;
         }
     }
 }
 class BankThread extends Thread {
     private Bank bank = null;

     public BankThread(Bank bank) {
         this.bank = bank;
     }

     @Override
     public void run() {
         System.out.println("取钱:" + bank.getMoney(400));
     }
 }

主测试程序:

  Bank bank=new Bank();
  BankThread b1=new BankThread(bank);
  b1.start();//柜台取钱
  BankThread b2=new BankThread(bank);
  b2.start();//ATM机上取钱

输出结果:
余额:100
取钱:400
取钱:-3

线程同步归纳总结

标签:

原文地址:http://blog.csdn.net/u013628152/article/details/51346428

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!