• 目录

synchronized关键字

阅读量: 403 编辑

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

  • 目录