java线程同步机制的方式:


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




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



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



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



推荐使用:同步代码块



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


 2.同步代码块可以很方便的控制需要被同步代码的范围,同步函数必须是整个函数的所有的代码都被同步了。

   
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();
}
}