天天看点

synchronized同步函数

java线程同步机制的方式:

方式二:同步函数就是synchronized修饰一个函数

同步函数需要注意的事项:

    1.非静态的同步函数的锁对象是this对象,静态的同步函数的锁对象是当前函数所属的类的字节码文件(class对象)

    2.同步函数的 锁对象是固定的,不能由你来指定。

推荐使用:同步代码块

原因:1.同步代码块的锁对象可以由我们随意指定,方便控制。同步函数的锁对象是固定的,不能由我们来指定。

package com.cn.thread;
/**
* Author:Liu Zhiyong
* Version:Version_1
* Date:2016年7月5日12:30:36
* Desc:方式二:同步函数
* 
* 同步函数需要注意的事项:
*   1.如果一个非静态的同步函数的锁对象是this对象,如果是静态的同步函数的锁对象是当前函数所属的类的字节码文件(class对象)
*   2.同步函数的 锁对象是固定的,不能由你来指定。
*   
* 推荐使用:同步代码块
*   原因:1.同步代码块的锁对象可以由我们随意指定,方便控制。同步函数的锁对象是固定的,不能由我们来指定。
*     2.同步代码块可以很方便的控制需要被同步代码的范围,同步函数必须是整个函数的所有的代码都被同步了。
*/
class  BankThread extends Thread{
  static int allMoney = 5000;//银行总共的钱
  public BankThread(String name) {
    super(name);
  }
  @Override
  public  void run() {
    getMoney();
    
//    while(true){
      synchronized("锁"){
//        if(allMoney > 0){
//          BankThread.allMoney -= 1000;
//            System.out.println(BankThread.currentThread().getName() + "取了" + 1000 + ",还剩" + allMoney);
//        }else{
//          System.out.println("钱取光了。。。");
//          break;
//        }
      }
//    }
//  //  需要执行的代码
//  //  需要执行的代码
//  //  需要执行的代码
//  //  需要执行的代码
//  //  需要执行的代码
//  //  需要执行的代码
//  //  需要执行的代码
//  //  需要执行的代码
  }
  //静态的函数。。函数所属的类的字节码文件对象(BankThread.class),锁对象是唯一的。
  public static synchronized void getMoney(){
    while(true){
//      synchronized("锁"){
        if(allMoney > 0){
          BankThread.allMoney -= 1000;
            System.out.println(BankThread.currentThread().getName() + "取了" + 1000 + ",还剩" + allMoney);
        }else{
          System.out.println("钱取光了。。。");
          break;
        }
//      }
    }
  }
}
public class Demo6 {
  public static void main(String[] args) {
    BankThread h = new BankThread("丈夫");
    h.start();
    BankThread w = new BankThread("妻子");
    w.start();
  }
}