synchronized关键字
-
synchronized关键字用来与对象的互斥锁联系
-
当某个对象用 synchronized 修饰时,表明该对象在任一时刻只能由一个线程访问
-
在Java中的两种使用synchronized的方式:
-
放在方法前面,这样,调用该方法的线程均将获得对象的锁
-
放在代码块前面,它也有两种形式:
-
synchronized (this){…}
或synchronized {…}
://代码块中的代码将获得当前对象引用的锁 -
synchronized(otherObj){…}
:代码块中的代码将获得指定对象引用的锁
-
一、代码实战
代码的详细解读,可以参考视频教程
取款机 :CashMachine.java
package com.qicong.gj.c30;
/**
* User: 祁大聪
*/
public class CashMachine {
int totalMoney = 10000;
//存钱,取钱,,如果是正数就是存钱,如果是负数就是取钱
public synchronized void doCash(int money){
String tName = Thread.currentThread().getName();
System.out.println(tName + ",来了,存或取钱,money = " + money);
totalMoney = totalMoney + money;
System.out.println(tName + ",操作完成,剩余钱数是:" + totalMoney);
System.out.println(tName + ",我要退出取钱机器了");
}
}
取钱人的线程 :PersonThread.java
package com.qicong.gj.c30;
/**
* User: 祁大聪
*/
public class PersonThread extends Thread{
CashMachine cm;
int money;
PersonThread(String name, CashMachine cm , int money){
super(name);
this.cm = cm;
this.money = money;
}
@Override
public void run() {
cm.doCash(money);
}
}
取钱线程运行 :S30.java
package com.qicong.gj.c30;
/**
* User: 祁大聪
*/
public class S30 {
public static void main(String[] args) {
CashMachine cm = new CashMachine();
cm.totalMoney = 20000;
PersonThread p1 = new PersonThread("张三", cm, -1000);
PersonThread p2 = new PersonThread("王五", cm, 500);
PersonThread p3 = new PersonThread("赵六", cm, -800);
PersonThread p4 = new PersonThread("李四", cm, -200);
p1.start();
p2.start();
p3.start();
p4.start();
}
}